【问题标题】:How to update Tkinter Label Text before executing some other function?如何在执行其他功能之前更新 Tkinter 标签文本?
【发布时间】:2018-05-05 23:28:06
【问题描述】:

我正在尝试使用 Tkinter 编写一个小型 GUI 程序。我想要做的是创建一个带有按钮和输入的窗口,它工作得很好。但是,我希望按钮运行一些函数func,它会更新 tkinter 窗口,一旦完成,接下来会运行:

import tkinter as tk
import time

def func():
    widgets = root.grid_slaves()
    for widget in widgets:
        if int(widget.grid_info()['row']) != 0:
            widget.destroy()
            startPrompt.configure(text="Updated Text")

    startPrompt.update_idletasks()
    # root.update_idletasks()  -- I have tried both and neither work

    # Just an example of something running, to verify that the loop executes 
    # before tkinter window gets updated
    for i in range(10):
        print(i)
        time.sleep(0.5)

font = ("Helvetica", 20)
root = tk.Tk()
startPrompt = tk.Label(root, text="Starting Prompt", font=font)
inputPrompt = tk.Label(root, text="Input Prompt", font=font)
root.textEntry = tk.Entry(root, width=50)
submitButton = tk.Button(root, text="Enter", command=func, width=20, pady=10, font=font)

startPrompt.grid(row=0, columnspan=2, padx=10, pady=10)
inputPrompt.grid(row=1, padx=10, pady=10)
root.textEntry.grid(row=1, column=1, padx=10)
submitButton.grid(row=2, columnspan=2)

root.mainloop()

我遇到的问题是,无论我尝试什么都行不通。我尝试过使用after(),但是我的程序编写方式使得重写所有内容以使其正常工作变得非常困难。我尝试过使用update_idletasks(),但这似乎也不起作用。

有谁知道为什么update_idletasks() 不起作用或者我使用错了,有什么办法可以解决我的问题吗?

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    在更改了几件事后似乎对我有用(其他的大多只是小优化)。

    1. func() 更改为 使用time.sleep(),如下所示—after() 通用小部件方法可以(也)用于执行此操作,并且使用它不会干扰@ 987654325@ 的运行方式与调用 sleep() 的方式相同。
    2. 在销毁小部件后调用通用小部件方法 update() 而不是 update_idletasks(),但仍在计数循环运行之前。

    这里有一些documentation 描述了如何以这种方式使用通用小部件方法after()(以及update() 方法的作用)。

    FWIW:如果您在问题示例代码的初始化部分中的 root = tk.Tk() 语句之后添加类似 root.geometry('600x400') 行的内容,您将能够更好地看到发生了什么(不是此处显示),这将防止窗口在小部件被销毁并更新显示后调整大小。

    def func():
        widgets = root.grid_slaves()
        for widget in widgets:
            if widget.grid_info()['row']:  # Don't need all that int() != 0 stuff.
                widget.destroy()
    
        startPrompt.configure(text="Updated Text")  # Only need to call once.
        root.update()  # Update display (startPrompt.update() also works here)
    
        # Just an example of something running, to verify that the loop executes
        # AFTER the tkinter window has been updated.
        for i in range(10):
            print(i)
    #        time.sleep(0.5)  # Don't use sleep in tkiner programs.
            root.after(500)  # Pause 500 millisecs.
    

    【讨论】:

    • 非常感谢!它似乎工作得很好!
    • dpumpkin:不幸的是,它工作得不太正常,但我相信我现在已经修好了。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多