在 Tkinter 中将图像用作背景时不显示图像
Image not displayed when using it as a background in Tkinter
喂!
我正在尝试在 Tkinter 创建的 GUI 中使用图像作为背景。它在这个项目的不同框架上使用相同的代码工作正常,但它不想在不同的框架中工作。我没有收到任何错误,框架只是空白。
感谢您的帮助!
这里我用图片做背景就好了:
def main_screen():
global screen
screen = Tk()
screen.geometry("600x750")
screen.configure(background="#022140")
screen.title("Hermes")
filename = PhotoImage(file="background.png")
filename_small = filename.subsample(2, 2)
background_label = Label(image=filename_small)
background_label.place(x=1, y=1, relwidth=1, relheight=1)
login_button = Button(text="Login", bg="#022140", height="2", width="30", command=login,
highlightbackground='#494B68')
screen.mainloop()
但是这里不行:
def login_sucess():
global screen3
screen3 = Toplevel(screen)
screen3.geometry("500x400")
filename = PhotoImage(file="main_theme.png")
filename_small = filename.subsample(2, 2)
background_label = Label(screen3, image=filename_small)
background_label.place()
感谢您的帮助!
应该很简单。当你在 tkinter 中处理图像时,你总是需要在你使用它的小部件上设置对该图像的引用。换句话说,做这样的事情:
from tkinter import Tk,Label,PhotoImage
root = Tk()
img = PhotoImage(file='background.png')
small_img=img.subsample(2, 2)
background_label = Label(root, image=small_img)
background_label.img=img
background_label.place(x=0, y=0, relheight=1, relwidth=1)
root.mainloop()
特别是当您在函数作用域或类似的东西中创建包含图像的 Label 时,设置该引用很重要,因为该 Labels 实例的变量将在函数调用结束后消失。
PS:为了更清楚地了解 master widget 以及为了小的性能改进,在初始化时总是给 widget 一个 master widget。我知道 tkinter 也会自动将最后创建的 Tk 实例分配为 master 本身,但是 a) 这是否需要不必要的计算能力和 b) 是否更容易跟踪哪个小部件是另一个小部件等等。 ;)
喂! 我正在尝试在 Tkinter 创建的 GUI 中使用图像作为背景。它在这个项目的不同框架上使用相同的代码工作正常,但它不想在不同的框架中工作。我没有收到任何错误,框架只是空白。 感谢您的帮助!
这里我用图片做背景就好了:
def main_screen():
global screen
screen = Tk()
screen.geometry("600x750")
screen.configure(background="#022140")
screen.title("Hermes")
filename = PhotoImage(file="background.png")
filename_small = filename.subsample(2, 2)
background_label = Label(image=filename_small)
background_label.place(x=1, y=1, relwidth=1, relheight=1)
login_button = Button(text="Login", bg="#022140", height="2", width="30", command=login,
highlightbackground='#494B68')
screen.mainloop()
但是这里不行:
def login_sucess():
global screen3
screen3 = Toplevel(screen)
screen3.geometry("500x400")
filename = PhotoImage(file="main_theme.png")
filename_small = filename.subsample(2, 2)
background_label = Label(screen3, image=filename_small)
background_label.place()
感谢您的帮助!
应该很简单。当你在 tkinter 中处理图像时,你总是需要在你使用它的小部件上设置对该图像的引用。换句话说,做这样的事情:
from tkinter import Tk,Label,PhotoImage
root = Tk()
img = PhotoImage(file='background.png')
small_img=img.subsample(2, 2)
background_label = Label(root, image=small_img)
background_label.img=img
background_label.place(x=0, y=0, relheight=1, relwidth=1)
root.mainloop()
特别是当您在函数作用域或类似的东西中创建包含图像的 Label 时,设置该引用很重要,因为该 Labels 实例的变量将在函数调用结束后消失。
PS:为了更清楚地了解 master widget 以及为了小的性能改进,在初始化时总是给 widget 一个 master widget。我知道 tkinter 也会自动将最后创建的 Tk 实例分配为 master 本身,但是 a) 这是否需要不必要的计算能力和 b) 是否更容易跟踪哪个小部件是另一个小部件等等。 ;)