gpt4 book ai didi

python - Tkinter:如何使字符出现在文本小部件上有时间延迟?

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

def write_text(widget, message, enter_number, slow_type=True):
widget.config(state="normal")
if slow_type:
if len(message) > 0:
widget.insert("insert", message[0])
if len(message) > 1:
widget.after(100, UI.write_text, widget, message[1:], 0)
else:
widget.insert("insert", message)

for i in range(enter_number):
widget.insert("insert", "\n")

widget.config(state="disabled")
widget.see("end")

这是我编写每个字符在时间延迟中显示的代码

但是我有一个问题:

如果我像这样调用这个方法(我有一个名为 text1 的小部件)。

write_text(text1, ">>>Invalid Input", 1)
write_text(text1, ">>>Try Again...", 2)

消息混合在一起,就像这样>>>>>>ITnrvya lAigda iInn.p.u.t

我希望它在输入上一条消息结束时输入消息。

我能做什么?

附注抱歉我的英语不好......

最佳答案

这里有一些可运行的东西,我认为它可以满足您的需求。您得到的“混合”输出是因为您必须对 write_text() 进行的第二次调用发生在第一个调用的所有(延迟)处理完成之前,因此文本小部件有效地通过以下方式获取更新两个独立的回调过程。

下面的代码通过将字符串的字符(以及它们所在的行)放入队列中来避免此问题,从而允许按照添加顺序检索它们。

DELAY = 100  # ms between widget updates

def update_widget(widget):
try:
line_number, text = widget._text_queue.get_nowait()
except queue.Empty:
return # Nothing further to do.

widget.insert('%s.end' % line_number, text)

if widget._text_queue.qsize(): # Anything more to process?
widget.after(DELAY, update_widget, widget)

def write_text(widget, message, line_number, slow_type=True):
if not slow_type:
widget.insert('%s.0' % line_number, message)
else:
for ch in message: # Add each character of message to queue.
widget._text_queue.put((line_number, ch))

update_widget(widget) # Start (or continue) update processing.

def add_text(widget):
widget.delete('1.0', tk.END) # Delete widget's current contents.

# Note: Tkinter always adds a newline at the very end of text widgets, so
# we need one less newline. This makes it possible to insert text onto
# any possible line of the widget -- which could fail if it was empty.
widget.insert('1.0', (widget['height']-1) * '\n') # Init with blank lines.
write_text(widget, ">>>Invalid Input", 1)
write_text(widget, ">>>Try Again...", 2)

if __name__ == '__main__':
root = tk.Tk()
text1 = tk.Text(root, width=40, height=3, bg='skyblue')
text1._text_queue = queue.Queue() # Add a Queue to it for delayed updates.
text1.grid()
button = tk.Button(root, text='Run Test', command=lambda w=text1: add_text(w))
button.grid()
root.mainloop()

关于python - Tkinter:如何使字符出现在文本小部件上有时间延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47227947/

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