【发布时间】:2023-04-10 04:03:01
【问题描述】:
我有一个脚本可以自动更改按钮上的图片。当我手动刷新我的框架时,图片会正常显示,但是当脚本执行时,它不会显示。当我将鼠标悬停在它上面时,我收到错误:_tkinter.TclError: image "pyimage" doesn't exist。当您尝试在方法中创建变量时,通常会发生相同的错误,因为该变量未绑定到它的对象。我确实在这里绑定它,但我认为它发生是因为我正在使用线程来运行该方法。当创建变量的方法由线程运行时,我无法弄清楚如何绑定变量。我尝试不使用线程,但后来遇到了无限递归问题。这是代码的重要部分:
self.screens = []
for pc in master.server.clients:
if pc['screen'] != '':
self.screens.append(ImageTk.PhotoImage(pc['screen']))
else:
self.screens.append(tk.PhotoImage(file='images/info-images/placeholder.png'))
row = 0
column = 0
for img in self.screens:
btk.ImageButton(self.body.interior, image=img, width=270, height=180).grid(row=row, column=column, padx=10, pady=10)
if column % 2 == 0 and column != 0:
row += 1
column = 0
else:
column += 1
thread = threading.Thread(target=self.update_images, args=(master,))
thread.start()
以及线程中的方法:
def update_images(self, master):
time.sleep(master.server.INFO_COOLDOWN)
computers = master.server.clients
for i in range(len(computers)):
if computers[i] != 'DISCONNECTED_USER':
if computers[i]['screen'] != '':
self.screens[i] = ImageTk.PhotoImage(computers[i]['screen'])
else:
self.screens[i] = tk.PhotoImage(file='images/info-images/placeholder.png')
不要担心btk.ImageButton,或者它的父self.body.interior,它们是自定义小部件,它们工作得很好。
【问题讨论】:
-
我没有看到任何关于这个 sn-p 会导致这种情况的信息。除了未绑定对象之外,此错误的另一个常见原因是在您的代码中多次使用
Tk()。如果不是这种情况,您必须出示 minimal reproducible example 才能获得帮助。 -
我确实注意到您似乎正在为 self.screens 中的每个图像启动一个线程,这似乎是无意的。
-
哦,复制时由于某种原因,缩进搞砸了。在代码中不是这样的。并且 Tk() 只存在一次。我现在将处理最小的可重现示例。
-
您是否确信您的线程中的 if 语句正在评估以使图像发生变化?
-
在函数中,您将
self.screens[i]重新分配给ImageTk.PhotoImage()或tk.PhotoImage()的新实例,但无需将这些按钮的image选项重新配置给这些实例。由于没有引用PhotoImage()的旧实例,因此它们被垃圾收集。因此按钮的图像消失了。
标签: python python-3.x tkinter python-imaging-library tk