【问题标题】:How to display one word after the other in tkinter [duplicate]如何在tkinter中一个接一个地显示一个单词[重复]
【发布时间】:2021-05-04 09:58:06
【问题描述】:

我有这个简单的 tkinter 代码:

from tkinter import *

listofwordstodisplay = ['apple', 'banana', 'kiwi', 'pear']
def word(idx):
    return listofwordstodisplay[idx]

root=Tk()
root.geometry("400x200")
root.configure(bg='white')

label=Label(root)

label.pack(anchor=CENTER, expand=TRUE)
label.configure(text=word(2))
sleep(2)
label.configure(text=word(3))
root.mainloop()

它只显示单词(3),即'pear'。如何让它显示 word(2),等待 2 秒,然后显示 word(3)?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    仅使用tkinter,您可以利用Tk.after 方法,例如。

    import time
    import threading
    import tkinter as tk
    
    words = ['apple', 'banana', 'kiwi', 'pear']
    
    def refresh_label(label, word):
        label.configure(text=word)
    
    root = tk.Tk()
    root.geometry("400x200")
    root.configure(bg='white')
    
    label = tk.Label(root)
    label.pack(anchor=tk.CENTER, expand=tk.TRUE)
    
    for i, word in enumerate(words):
        # binding word required because of the loop
        label.after(1000 * i, lambda w=word: label.configure(text=w))
    
    root.mainloop()
    

    你也可以使用类似threads的东西来并行运行代码而不阻塞UI主循环:

    Tkinter 不是线程安全的,您需要将 UI 更新委托给 UI 线程本身,例如使用 pub/sub 系统,请参阅 https://stackoverflow.com/a/54374873/1812262

    【讨论】:

    • 说你必须使用类似线程的东西是不正确的。无需线程或任何类型的多处理即可轻松完成 OP 想要的操作。
    • 你确实可以使用Tk.after方法,我忘了。我正在编辑我的答案
    • 除了不需要使用多线程之外,tkinter 不是线程安全的,因此从不同的 GUI 更新可能会导致问题。
    • @martineau 谢谢,也为此更新了
    • 看起来真的很有帮助,谢谢。我会尽快尝试的。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多