【问题标题】:How can I show an emergent window every hour?如何每小时显示一个紧急窗口?
【发布时间】:2021-04-14 06:35:39
【问题描述】:

使用tkinter,我正在做一个紧急窗口来提醒我喝水。此时它可以工作,但现在我希望def trinke_wasser 的部分每小时重复一次。我尝试了time 模块,但最后我不知道在哪里写。

这是我的代码:

from tkinter import *
from PIL import Image
from PIL import ImageTk

fenstern = Tk()
fenstern.title("Warnung")
fenstern.geometry("900x600")
datei = Image.open('wasser_pic.png')
bild = ImageTk.PhotoImage(datei)
img = Label(fenstern, image = bild)
img.place(x=0, y=0)

def choice(option):

    pop.destroy()


def trinke_wasser():

    global pop
    fenstern.wm_state('iconic')

    pop = Toplevel(fenstern)
    pop.title('popup')
    pop.geometry("900x600")
    back= Label(pop, image = bild)
    back.place(x=0, y=0)

    rhamen = Frame(pop, bg = "white")
    rhamen.pack(pady = 5)

    yes = Button(rhamen, text = "YES", command = lambda: choice ("yes"), bg = "orange")
    yes.grid(row=0, column=1)

die_Taste = Button(fenstern, text = "Beginnen", command = trinke_wasser )
die_Taste.pack(pady=100)

fenstern.mainloop()

【问题讨论】:

  • 为什么不使用调度程序应用程序,例如 Linux 中的 cron 作业,每小时执行一次脚本?

标签: python loops tkinter timer repeat


【解决方案1】:

在时间库中,有一个休眠功能可以等待指定的秒数。因此,如果我们计算一小时内的秒数或 3600。我们可以调用 sleep 函数,它会等待正好 1 小时。

import time

time.sleep(3600)

因此,如果您将 sleep 函数放在 trinke_wasser 函数的末尾。它会告诉你喝水,等一个小时再重复一遍,一遍又一遍

【讨论】:

  • 但它不会再次显示窗口,它只是在第一次显示窗口之前延迟 5 秒(例如time.sleep(5))。
  • 你有没有把函数放在while True循环中?
【解决方案2】:

在您当前的程序中,您只需在按键时执行一次trinke_wasser() 函数。您要做的是打开一个调度程序函数,该函数每小时调用一次该函数。 但是您必须允许此功能永久终止。因此,您需要一个可以关闭的全局布尔变量来结束循环。 (你也可以强行结束程序执行,但这样不好)

所以,您要做的是通过在脚本开头添加import time 来导入时间库。 定义fenstern后,只要不设为false就给这个窗口增加一个属性True即可:fenstern.running = True

然后,您可以制作调度程序功能:

def nerv_mich(delay = 3600):
    while fenstern.running:
        trinke_wasser()
        time.sleep(3600)

此功能将永远运行,并要求您每 3600 秒喝一次水。

你只需要调整第一个按钮的命令:

die_Taste = Button(fenstern, text = "Beginnen", command = nerv_mich)

现在,您只需在 yes 的定义之后使用第二个按钮将其关闭

fertig = Button(rhamen, text = "Fertig jetzt!", command = lambda: choice ("fertig"), bg = "orange")
    yes.grid(row=2, column=1)

最后,您必须更改函数choice() 以在传递给它的选项为"fertig" 后真正结束整个事情:

def choice(option):
    pop.destroy()
    if option=="fertig": fenstern.running=False

应该可以。您也可以使用fentstern.destroy() 在此时完全结束您的程序。老实说,您可能并不真的需要这个初始窗口。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2010-12-03
    相关资源
    最近更新 更多