gpt4 book ai didi

python - Tkinter 中的小部件如何更新?

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:49 25 4
gpt4 key购买 nike

好的,所以我只是想澄清一下为什么我的代码没有像我想象的那样工作。

我正在构建一个 GUI,我想在带有文本变量的 Label 上显示文本。我已经制作了一个函数,在调用该函数时更新标签,但这当然不是我的问题。

我的问题源于我试图实现“一次打印一个字母”类型的标签。虽然它以我想要的方式打印到终端,但标签小部件仅在整个功能完成后更新(在视觉上它与只打印整个字符串而不是一次打印一个字母相同)。

那么我错过了什么,我不明白什么?你们能帮帮我吗?让我发布一些代码,以便你们可以看到我的错误所在。

我分别尝试了这两种方法,它们都给我带来了相同的结果,这不是我想要的。

def feeder(phrase):
"""Takes a string and displays the content like video game dialog."""
message = ""
for letter in phrase:
time.sleep(.15)
message += letter
information.set(message)
#print message

def feeder2(phrase):
"""Same as feeder, but trying out recursion"""
current.index += 1
if current.index <= len(phrase):
information.set(phrase[:current.index])
time.sleep(.1)
feeder2(current.status())

我不确定是否需要发布更多代码,以便你们更好地理解,但如果是这样的话,我会这样做。

这2个函数在这个函数中用到了

def get_info():
"""This function sets the textvariable information."""
#information.set(current)
feeder2(current.status())

在这个函数中又用到了哪些

def validate():
""" This function checks our guess and keeps track of our statistics for us. This is the function run when we press the enter button. """
current.turn += 1
if entry.get() == current.name:
if entry.get() == "clearing":
print "Not quite, but lets try again."
current.guesses -= 1
if entry.get() != "clearing":
print "Great Guess!"
current.points += 1

else:
print "Not quite, but lets try again."
current.guesses -= 1
print current
get_info()
entry.delete(0, END)
current.name = "clearing"

最佳答案

每次进入事件循环时,UI 都会更新。这是因为绘画是通过事件完成的(也称为“空闲任务”,因为它们是在 UI 空闲时完成的)。

您的问题是这样的:当您编写一个循环并执行 time.sleep 时,在该循环运行时不会进入事件循环,因此不会发生重绘。

您至少可以通过几种不同的方式解决您的问题。其一,您只需调用 update_idletasks 即可刷新屏幕。这将解决重绘问题,但由于您正在休眠,因此 UI 在循环期间将无响应(因为按钮和按键不是“空闲任务”)。

另一种解决方案是编写一个函数,它接受一个字符串,从字符串中提取一个字符并将其添加到小部件中。然后它安排自己通过事件循环再次调用。例如:

import Tkinter as tk

class App(tk.Tk):
def __init__(self,*args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.label = tk.Label(self, text="", width=20, anchor="w")
self.label.pack(side="top",fill="both",expand=True)
self.print_label_slowly("Hello, world!")

def print_label_slowly(self, message):
'''Print a label one character at a time using the event loop'''
t = self.label.cget("text")
t += message[0]
self.label.config(text=t)
if len(message) > 1:
self.after(500, self.print_label_slowly, message[1:])

app = App()
app.mainloop()

这种类型的解决方案可确保您的 UI 保持响应,同时仍在循环中运行您的代码。只不过,不是使用显式循环,而是将工作添加到已经运行的事件循环中。

关于python - Tkinter 中的小部件如何更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com