通过线程制作时 Tkinter 图像不显示
Tkinter images not showing up when made through thread
我有一个脚本可以自动更改按钮上的图片。当我手动刷新我的框架时,图片正常显示,但是当脚本刷新时,它不会显示。当我将鼠标悬停在它上面时,出现错误:_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
,它们是自定义小部件,它们工作得很好。
没关系,问题是图像未绑定到对象,因此被垃圾收集并清空。
我有一个脚本可以自动更改按钮上的图片。当我手动刷新我的框架时,图片正常显示,但是当脚本刷新时,它不会显示。当我将鼠标悬停在它上面时,出现错误:_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
,它们是自定义小部件,它们工作得很好。
没关系,问题是图像未绑定到对象,因此被垃圾收集并清空。