【问题标题】:Tkinter freezes while waiting for callback using afterTkinter 在使用 after 等待回调时冻结
【发布时间】:2017-10-22 09:03:10
【问题描述】:

我正在尝试使用 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 进行编码,但我可能还没有开始学习应该首先学习的基本知识。但是,嘿,这就是让我开心的地方。 :)

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    当你在下一行使用 after 时;

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

    该函数被立即调用。这意味着您的程序会冻结,因为它只是一次又一次地调用自己。

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

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

    希望这会有所帮助!

    【讨论】:

    • 谢谢!你知道这背后的逻辑吗?
    • 当你把()放在一个短语后面时,Python会尝试调用那个函数,不管它是否在after这样的语句中,在这种情况下。因此,Tkinter 采用您希望调用的函数名称以及您希望传递的任何参数,以便在您指定时它可以这样做。
    猜你喜欢
    • 2018-06-11
    • 2021-05-03
    • 2019-05-10
    • 1970-01-01
    • 2018-12-30
    • 2014-08-08
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多