【问题标题】:tkinter "window.after" loop stopped after overnight Windows sleep/resumetkinter“window.after”循环在夜间 Windows 睡眠/恢复后停止
【发布时间】: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。不知道是否以及如何解决这个问题......

标签: python windows loops tkinter sleep


【解决方案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()

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 2012-03-04
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2020-09-02
    • 2013-05-26
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多