最初,我可以通过将一个键绑定到画布上来使其工作,我不知道为什么该方法起作用,但是后来又停止了作用,所以我进一步进行了调查。
设置了一些测试后,我设法制作了一个简短的代码来复制问题:
from tkinter import *
class SomeClass:
def __init__(self, master):
self.can = Canvas(master, bg="gray")
self.can.pack()
thing = PhotoImage(file=("./img/thing.PNG"))
img = self.can.create_image(20, 20, image=thing)
stuff = self.can.find_all()
print(stuff)
app = Tk()
SomeClass(app) # Does not work
something = SomeClass(app) # Dos not work
# This part does work:
can = Canvas(app, bg="gray")
can.pack()
thing = PhotoImage(file=("./img/thing.PNG"))
img = can.create_image(20, 20, image=thing)
stuff = can.find_all()
print(stuff)
app.mainloop()
在所有情况下,img都作为一个项目显示在find_all()中,但前两个未在画布上显示。
还尝试将图像的创建作为带有绑定的方法来激活它,因为它认为在初始化期间出错。这没有任何改变。
那我在做什么错了?
答案 0 :(得分:0)
当我终于找到问题所在时,回答我自己的问题。
我没有阅读有关PhotoImage的文档中的这一行:
“您必须在Python程序中保留对图像对象的引用,方法是将其存储在全局变量中,或者将其附加到另一个对象。”
因此,在这种情况下,使它起作用的方法是:
app = Tk()
thing = PhotoImage(file=("./img/thing.PNG")) # making it a global variable
或
class SomeClass:
def __init__(self, master):
self.can = Canvas(master, bg="gray")
thing = PhotoImage(file=("./img/thing.PNG")
self.can.img = thing # This attaches the image to the canvas object
希望这可以帮助遇到此问题的其他人。