Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在执行其他功能之前更新Tkinter标签文本?_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 如何在执行其他功能之前更新Tkinter标签文本?

Python 如何在执行其他功能之前更新Tkinter标签文本?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在尝试使用Tkinter编写一个小型GUI程序。我试图做的是创建一个带有按钮和输入的窗口,它工作得很好。但是,我希望按钮运行一些更新tkinter窗口的函数func,完成后运行下一步: import tkinter as tk import time def func(): widgets = root.grid_slaves() for widget in widgets: if int(widget.grid_info()['row']) != 0:

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

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\u idletasks()
,但这似乎也不起作用


有人知道为什么
update\u idletasks()
不起作用,或者我用错了,有什么办法可以解决我的问题吗?

在改变了一些东西后,似乎对我有效(其他的大多只是一些小优化)

  • func()
    更改为不使用
    time.sleep()
    如下所示,也可以使用
    after()
    通用小部件方法来执行此操作,并且使用它不会干扰
    mainloop()
    调用
    sleep()
    的方式运行
  • 在销毁小部件后但仍在计数循环运行之前调用通用小部件方法
    update()
    ,而不是
    update\u idletasks()
    下面介绍了如何以这种方式使用通用小部件方法
    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.
    

    非常感谢你!它似乎工作得很好!丹普金:不幸的是,它工作不太正常,但我相信我现在已经修好了。无论如何,谢谢你。