【问题标题】:after() method temporarily freezes tkinter GUIafter() 方法暂时冻结 tkinter GUI
【发布时间】:2021-05-03 16:28:47
【问题描述】:

我正在尝试使用 after 方法使 tkinter 标签中的文本在十秒后更改。但是当我运行程序时,十秒钟内什么也没有发生,并且 GUI 出现并且标签有第二个文本,而不是第一个。我想要的是 GUI 出现,并且标签具有第一个文本,十秒钟后标签中的文本应该更改为第二个文本。

import tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("sistema de registro de peso aromaticas")
        self.container = tk.Frame(self)
        self.container.pack(side="top", fill="both", expand=True)
        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)
        self.etiqueta=tk.Label(text="1")
        self.etiqueta.pack()
        def cambio():
            self.after(10000, None)
            self.etiqueta.configure(text="2")
        cambio()

app = SampleApp()
app.mainloop()

我知道我可以在不使用类继承的情况下使其工作,但我正在制作一个包含各种窗口的界面,并且我为每个窗口使用不同的类。所以我需要这个在课堂上工作。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    self.after(10000, None)self.after(10000) 相同,实际上与time.sleep(10) 相同。它会冻结 UI,直到计时器周期结束。

    如果你想打电话给self.etiqueta.configure(text="2"),那么你可以这样做:

    def cambio():
        self.etiqueta.configure(text="2")
    self.after(10000, cambio)
    

    这将导致 cambio 函数在 10 秒后运行。

    【讨论】:

    • 或者简而言之self.after(10000,lambda: self.etiqueta.configure(text="2")) ?
    • 谢谢酷云这解决了我的问题,但是以前没有用?为什么我需要放一个 lambda 函数?有了这个mrthod,我不能一遍又一遍地调用相同的函数,比如每10秒更新一次标签文本或类似的东西?我知道这超出了原始问题的范围,但我想学习如何很好地使用 tkinter。
    • @countzero:我的回答解释了为什么它以前不起作用。在没有第二个参数的情况下调用 after 只会冻结应用程序。你必须告诉它你想在延迟之后运行什么函数。
    • @countzero 您应该遵循这个答案,然后在函数内部输入self.after(10000, cambio)。这将使它像一个循环
    • 但是@BryanOakley,当我按照你在回答中所说的那样做时,我一直遇到同样的问题,10 秒内什么也没发生,然后 gui 出现在标签上的文字为 2。
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 2019-12-16
    • 2015-04-08
    • 2011-02-09
    • 2018-05-03
    • 2015-11-11
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多