此问题已在此处有答案:
Why does Tkinter image not show up if created in a function?(5个答案)
昨天关门了。
我正试图为我的GitHub页面做一个项目,并学习如何编码。我有Tkinter的问题,当我试图添加一些背景照片没有什么变化。
class GuiImainPage:
def __init__(self):
self.root = Tk()
self.lib = Library()
self.MAIN_PAGE()
def MAIN_PAGE(self):
self.root.title('Library')
Label(self.root, text="Choose Login Or Register", width="300", height="2").pack()
Label(self.root, text="").pack()
Button(self.root, text="Login", height="2", width="30", command=self.login_window).pack()
Button(self.root, text="Register", height="2", width="30", command=self.register_windows).pack()
self.CONFIGURE_GUI(self.root, None, None)
self.SET_IMAGE()
self.root.mainloop()
def SET_IMAGE(self):
my_canvas = tk.Canvas(self.root, width=width, height=height)
my_canvas.pack(fill=tk.BOTH, expand=tk.YES)
bg = tk.PhotoImage(file="bookImage.png")
my_canvas.create_image(10, 10, image=bg,anchor="nw")
GuiImainPage()
其中CONFIGURE是我所有页面的一些常规设置。我认为这应该足以解决问题(现在文件有~400行)。
如果可能的话,我不想使用画布(如果需要更改所有文件)。
我尝试了许多应该调用SET_IMAGE的组合。
1条答案
按热度按时间li9yvcax1#
由于背景图像在函数
SET_IMAGE
中被定义为局部变量,因此在函数结束后,图像的数据将被垃圾收集。因此,TkInter无法绘制图像,因为图像的数据现在是空白的。要解决这个问题,只需将图像定义为示例变量。这将导致它不会被垃圾收集:
此外,如果您想使用图像作为背景图像,那么使用画布可能不是正确的方法。
更简单的方法是将图像放在
tk.Label
中,然后使用place
方法使标签填充整个窗口:relwidth
和relheight
参数将导致图像填充整个窗口。此外,为了使背景图像实际上出现在后面(而不是覆盖其他所有内容),请确保在打包其他小部件之前调用
SET_IMAGE
: