Python Tkinter-无法使用标签跟踪进度
我正在使用python中的tkinter GUI包,并希望跟踪一个进程的进度,该进程在列表中循环,并为列表中的每个项目执行某些操作。我想在显示“Item 1 of 100 processed”的标签中跟踪进度。该标签绑定到一个字符串变量。以下是我最初尝试的:Python Tkinter-无法使用标签跟踪进度,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在使用python中的tkinter GUI包,并希望跟踪一个进程的进度,该进程在列表中循环,并为列表中的每个项目执行某些操作。我想在显示“Item 1 of 100 processed”的标签中跟踪进度。该标签绑定到一个字符串变量。以下是我最初尝试的: def runLoop(self): for site in self.sitelist: #Do stuff self.x+=1 self.outLabelStrVar="Item
def runLoop(self):
for site in self.sitelist:
#Do stuff
self.x+=1
self.outLabelStrVar="Item " + str(self.x) + " of " + str(len(self.sitelist)) + " processed."
然而,这当然不会实时更新,因为我从未返回tkinter窗口mainloop,就像在类似的线程中所建议的那样
因此,我更新了代码,使函数递归:
def runLoop(self, item=None):
if item is None:
for site in self.sitelist:
self.after(1,runLoop(site))
else:
self.x+=1
self.outLabelStrVar="Item " + str(self.x) + " of " + str(len(self.sitelist)) + " processed."
我认为在for循环的每次迭代中都会返回到主tkinter循环。但这也不会实时更新输出标签
我误解了什么?我在代码中没有看到任何
StringVar
,您是否在标签的textvariable
中使用了一个?(请参阅)self.after(1,runLoop(site))
立即调用runLoop()
(导致与前面完全相同的问题),然后1毫秒后什么也不做(因为runLoop()
返回None,这就是您实际传递给after()
)。您需要以self.after(1,runLoop,site)
的形式编写此函数,以实际推迟函数调用。@jasonharper谢谢,您的响应中包含了我更新代码所需的信息,以便它能够正常工作。我想我主要是误解了after方法。尽管实际上我仍然感到困惑,但如果#do stuff代码与web交互(它确实交互),我可能不想只是在列表中循环运行它。如何等到一个循环完成后再开始下一个循环?如果每个项目都需要很短的时间来处理,您可能希望先安排一个,然后在处理结束时安排下一个(而不是一次全部安排)。如果处理这些项目可能需要很长的时间,则需要在单独的线程中运行它们,以保持GUI的响应性。