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 睡眠/恢复后停止的主要内容,如果未能解决你的问题,请参考以下文章

Python 使用 tkinter 同时循环两个循环

Tkinter 嵌套主循环

锯齿 tkinter 主循环帧持续时间?

Androidkiller在夜神模拟器上编译安装

Python D-Bus 和 Tkinter 主循环集成

使用 Tkinter 在 while 循环中录制语音