Python 如何在执行其他功能之前更新Tkinter标签文本?
我正在尝试使用Tkinter编写一个小型GUI程序。我试图做的是创建一个带有按钮和输入的窗口,它工作得很好。但是,我希望按钮运行一些更新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:
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.
非常感谢你!它似乎工作得很好!丹普金:不幸的是,它工作不太正常,但我相信我现在已经修好了。无论如何,谢谢你。