【问题标题】:How do I place an image in the same window in Tkinter?如何在 Tkinter 的同一窗口中放置图像?
【发布时间】:2016-05-23 09:37:49
【问题描述】:

我试图将图像放在同一个窗口中,但它会在新窗口中打开,我不知道为什么。我试过谷歌,但找不到任何可以帮助我的东西。如何指定图像应放置在打开的初始窗口而不是其自己的单独窗口中?

import Tkinter as tk
import io
import base64
# Import the function for downloading web pages
from urllib import urlopen

# Import the regular expression function
from re import findall

# Import the Tkinter functions
from Tkinter import *

# Import Python's HTML parser
from HTMLParser import *
class MainWindow(tk.Frame):
        root = tk.Tk()

        def __init__(self, *args, **kwargs):
            tk.Frame.__init__(self, *args, **kwargs)

        def createimage(self):  
            # a little more than width and height of image
            w = 520
            h = 320
            x = 80
            y = 100
            # use width x height + x_offset + y_offset (no spaces!)
            # this GIF picture previously downloaded from tinypic.com
            image_url = "http://i46.tinypic.com/r9oh0j.gif"
            image_byt = urlopen(image_url).read()
            image_b64 = base64.encodestring(image_byt)
            self.photo = tk.PhotoImage(data=image_b64)
            # create a white canvas
            #topframe = Frame(root)
            cv = tk.Canvas(bg='white')
            cv.pack(side='top', expand='yes')
            # put the image on the canvas with
            # create_image(xpos, ypos, image, anchor)
            cv.create_image(10, 10, image=self.photo, anchor='nw')

if __name__ == "__main__":
    root = tk.Tk()
    main = MainWindow(root)
    root.geometry("400x300")
    main.pack(side="top", fill="both", expand=True)
    main.createimage()
    root.mainloop()

【问题讨论】:

  • 您正在显式创建两个根窗口。计算tk.Tk() 在您的代码中出现的次数。

标签: python image tkinter window frame


【解决方案1】:

1。为什么会在单独的窗口中打开?

您需要将一个 master 传递给每个构造函数。这应该是新小部件应放置在其中的小部件(Tk、Frame、Toplevel、Canvas...)。像这样:

tk.Canvas(master = self, g='white')
tk.PhotoImage(master = self, data=image_b64)

当master被销毁时,以它为master的widget也会被销毁。

2。它在哪个窗口中打开?

Tkinter 有默认的根目录,即创建的第一个窗口。此窗口用于您未将 master 传递给的任何小部件。

即第一个root = tk.Tk()

【讨论】:

  • 当初始窗口启动时,会打开另一个窗口,里面有图像,但我希望在第一个窗口中打开图像而无需第二次。
  • 是的,我明白了。尝试在适当的位置添加master = self。当您更改代码时,您的结果是什么?
  • 我意识到我在课堂上第二次调用 tk.Tk()。当我将 master = self 添加到它时,它解决了问题,但是当我删除对 tk.Tk() 的调用时,我最终不再需要指定 master,因为它只是默认为正确的窗口。非常感谢,你帮了我很多。
  • "此窗口用于您未将主控器传递给的任何小部件。"不是一个真实的陈述。 Tkinter 将在您创建小部件并且没有根窗口时第一次自动创建一个根窗口。一旦创建了根窗口,tkinter 将不会自动创建更多。