【发布时间】:2020-06-29 04:29:17
【问题描述】:
Windows 10 与 Python 2.7.13(32 位)
我有一个带有进度条的 Python tkinter 程序。程序执行一个长时间运行的操作,然后在重复之前等待一定的时间。
为了向用户提供反馈,当倒计时到下一个操作时,进度条会在确定模式下更新,然后在操作期间(持续时间未知)切换到不确定模式。
15-30 分钟后,在使用以下代码进行倒计时时,Windows 会弹出 python.exe 已停止工作 对话框,仅提供关闭程序的选项,并且程序无响应(大概是因为 Windows 已经停止了它)。
我无法弄清楚为什么会发生这种情况。在此期间,在 GUI 中运行以下代码段:
def wait_nextop(self, delay):
end = time.time() + delay
self.progress_bar.stop()
self.progress_bar.config(mode = 'determinate', max = delay)
while time.time() < end:
remaining = (end - time.time()) + 1
self.progress_bar.config(value = (delay - remaining))
remaining_text = str(datetime.timedelta(seconds = int(remaining)))
self.progress_text.config(text = 'Next operation in ' + remaining_text)
time.sleep(0.1)
self.progress_text.config(text = 'Operation in progress')
self.progress_bar.config(mode = 'indeterminate')
self.progress_bar.start()
在此,delay 是以秒为单位的整数延迟。 self.progress_bar 是 ttk.ProgressBar 的一个实例,self.progress_text 是 tkinter.Label 的一个实例。 time 和 datetime 来自标准库。
Python 不提供堆栈跟踪,我目前没有其他系统可用于测试它。需要注意的是,这个 GUI 函数是由另一个线程调用的,但打算在主线程中执行。
我已经看到了这些类似的问题,但找不到有效的解决方案:
【问题讨论】:
-
你不应该从创建小部件的线程以外的任何线程调用 tkinter 函数。
-
遵循这种方法threaded
Progressbar。 -
@stovfl :您发布的方法似乎已经解决了问题,谢谢!我已经发布了一个使用该系统作为 Python 2.7 答案的工作示例,因为该示例似乎适用于 Python 3
标签: python multithreading python-2.7 tkinter