python 无法将背景添加到Tkinter窗口[重复]

n6lpvg4x  于 2023-04-10  发布在  Python
关注(0)|答案(1)|浏览(158)

此问题已在此处有答案

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的组合。

li9yvcax

li9yvcax1#

由于背景图像在函数SET_IMAGE中被定义为局部变量,因此在函数结束后,图像的数据将被垃圾收集。因此,TkInter无法绘制图像,因为图像的数据现在是空白的。
要解决这个问题,只需将图像定义为示例变量。这将导致它不会被垃圾收集:

self.bg = tk.PhotoImage(file="bookImage.png")

此外,如果您想使用图像作为背景图像,那么使用画布可能不是正确的方法。
更简单的方法是将图像放在tk.Label中,然后使用place方法使标签填充整个窗口:

def SET_IMAGE(self):
        self.bg = tk.PhotoImage(file="bookImage.png")
        self.bg_label = tk.Label(self.root, image=self.bg)
        self.bg_label.place(x=0, y=0, relwidth=1, relheight=1)

relwidthrelheight参数将导致图像填充整个窗口。
此外,为了使背景图像实际上出现在后面(而不是覆盖其他所有内容),请确保在打包其他小部件之前调用SET_IMAGE

def MAIN_PAGE(self):
        self.root.title('Library')
        self.SET_IMAGE()
        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.root.mainloop()

相关问题