Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter-无法使用标签跟踪进度_Python_Python 3.x_Tkinter - Fatal编程技术网

Python Tkinter-无法使用标签跟踪进度

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

我正在使用python中的tkinter GUI包,并希望跟踪一个进程的进度,该进程在列表中循环,并为列表中的每个项目执行某些操作。我想在显示“Item 1 of 100 processed”的标签中跟踪进度。该标签绑定到一个字符串变量。以下是我最初尝试的:

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的响应性。