tkinter“window.after”循环在夜间 Windows 睡眠/恢复后停止
Posted
技术标签:
【中文标题】tkinter“window.after”循环在夜间 Windows 睡眠/恢复后停止【英文标题】:tkinter "window.after" loop stopped after overnight Windows sleep/resume 【发布时间】:2021-11-27 21:41:46 【问题描述】:我遇到的问题是在后台运行并使用“window.after”样式递归循环每 0.5 秒更新一次的小型 python 应用程序。它正常工作,甚至在计算机进入睡眠模式并(不久)恢复时继续运行,但是当计算机在一夜之间睡眠时,循环停止在恢复时重复。该程序显然仍在主循环中运行,因为它是响应式的,所以我想弄清楚为什么该循环停止了。
下面是我所说的循环类型的一个简单示例:
import tkinter as tk
import datetime
def looped_function(window):
print(datetime.datetime.now())
window.after(1000, lambda: looped_function(window))
if __name__ == '__main__':
window = tk.Tk()
looped_function(window)
window.mainloop()
有没有人建议为什么这种情况只会发生在长期睡眠/恢复时?有没有一种简单的方法来检测计算机恢复,或者循环中断并自动修复它?
【问题讨论】:
FWIW,你不必在这里使用 lambda。你可以做window.after(1000, looped_function, window)
@Bryan:虽然是这样,但我认为在这里使用lambda
实际上更清晰,更简洁)。
Mandias:Windows 有不止一个级别的“睡眠”(即 S1–S3),其中一些(显然)您的 python 应用程序被挂起 - 请参阅System Power States。不知道是否以及如何解决这个问题......
【参考方案1】:
倒数第二个语句looped_function(window)
的代码中有错误
这是一个从不返回的调用,所以mainloop
永远不会被执行。
注意:
根据 Windows 10 文档:
问题: 如何在睡眠状态下保持程序运行,Windows 10
回答: 只有一种方法是禁用睡眠、休眠和混合睡眠。 只需在选定的时间后关闭屏幕即可。 这是程序继续运行的唯一方式。
import tkinter as tk
import datetime
def looped_function(window):
print(datetime.datetime.now())
window.after(500, looped_function, window)
if __name__ == "__main__":
window = tk.Tk()
# looped_function(window) < CODING ERROR IS HERE
window.after(500, looped_function, window)
window.mainloop()
【讨论】:
以上是关于tkinter“window.after”循环在夜间 Windows 睡眠/恢复后停止的主要内容,如果未能解决你的问题,请参考以下文章