Tkinter在等待回调时冻结

2024-09-27 00:12:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Tkinter构建一个小的Python GUI应用程序。当应用程序打开时,将打开一个主窗口。然后你可以点击一个按钮打开一个新的顶层。在这个顶层,有一个定时器(倒计时)在按下按钮时启动。在

我的问题是,当计时器倒计时时,顶层冻结。我可能错过了一些关于Tkinter如何工作(以及如何构造代码)的基本知识。我希望你能澄清为什么代码没有按预期工作。在

from tkinter import *

class Application:def __init__(self, master=NONE):
    self.root = Tk()

    btnTimer = Button(self.root, text="Open timer", command=self.open_timer)
    btnTimer.grid(row=1, column=0)

    self.root.mainloop()

def open_timer(self):
    # Hide main window
    self.root.withdraw()  # Hide main window

    # Make window for controls
    self.wdowControl = Toplevel(self.root)

    # Timer
    self.wdowControl.timerText = Label(self.wdowControl, text="00:00:00", font=("Helvetica", 80))
    self.wdowControl.timerText.grid(row=0, column=0)

    btnStart = Button(self.wdowControl, text="Start timer", command=self.start_timer)
    btnStart.grid(row=1, column=0)

def start_timer(self):
    self.update_timer(5) # Timer in seconds

def update_timer(self, t):
    if t > 0:
        m, s = divmod(t, 60)
        h, m = divmod(m, 60)

        timeLeft = "%d:%02d:%02d" % (h, m, s)
        self.wdowControl.timerText.configure(text=timeLeft)
        t -= 1
        self.wdowControl.after(1000, self.update_timer(t)) 
    else:
        self.wdowControl.timerText.configure(text="00:00:00", fg='red')

app = Application())

注意:我昨天开始用Python编写代码,我可能还没有从应该首先学习的基本知识开始。但这让我很开心。:)


Tags: 代码textselftkinterdefupdatecolumnroot
1条回答
网友
1楼 · 发布于 2024-09-27 00:12:44

在以下行中使用after时

self.wdowControl.after(1000, self.update_timer(t)) 

函数正在被直接调用。这意味着你的程序冻结了,因为它只是一次又一次地调用自己。在

要像在本例中使用after传递变量,可以在函数名后使用另一个逗号来指定它。因此,要修复程序,您需要将我提到的行改为:

^{pr2}$

希望这有帮助!在

相关问题 更多 >

    热门问题