Python 3.x Python tkinter,如何逐个显示消息

Python 3.x Python tkinter,如何逐个显示消息,python-3.x,tkinter,Python 3.x,Tkinter,我正在使用tkinter(Python版本3.9)构建一个应用程序。在应用程序中,我希望消息可以显示一个一个根据程序的进展。但是,我的应用程序现在只能同时打印所有消息 示例代码如下所示: import time import tkinter as tk def start(): txt_edit.delete(1.0, tk.END) for _ in range(10): txt_edit.insert(tk.END, f"\nmessage sh

我正在使用tkinter(Python版本3.9)构建一个应用程序。在应用程序中,我希望消息可以显示一个一个根据程序的进展。但是,我的应用程序现在只能同时打印所有消息

示例代码如下所示:

import time
import tkinter as tk


def start():
    txt_edit.delete(1.0, tk.END)
    for _ in range(10):
        txt_edit.insert(tk.END, f"\nmessage should be printed out one by one")
        # do something here
        time.sleep(0.5)
        # job done


window = tk.Tk()
window.title("User Interface")
window.rowconfigure(0, minsize=40, weight=1)
window.rowconfigure(1, minsize=200, weight=1)
window.columnconfigure(1, minsize=200, weight=1)

lbl_1 = tk.Label(master=window, text="Question: ")
lbl_2 = tk.Label(
    master=window, text="How to print the text out one by one?", anchor="w"
)
lbl_1.grid(row=0, column=0, sticky="ns")
lbl_2.grid(row=0, column=1, sticky="nsew")

txt_edit = tk.Text(window, relief=tk.SUNKEN, bd=2)
fr_buttons = tk.Frame(window)
btn_open = tk.Button(master=fr_buttons, text="Start", command=start)
btn_open.grid(row=0, column=0, sticky="ew", padx=5, pady=5)

fr_buttons.grid(row=1, column=0, sticky="ns")
txt_edit.grid(row=1, column=1, sticky="nsew")

window.mainloop() 
这个问题的解决办法是什么?谢谢

从tkinter应用程序调用
time.sleep()
不是一个好主意。您的
main循环
time.sleep()
冲突。您的程序运行正常,但不会显示更改

最简单的解决方案是更新屏幕。但正如我所说,您应该避免使用
time.sleep()
。下面的解决方案满足了您的问题,尽管它冻结了您的程序,无法在更大的应用程序上工作

def start():
    global window
    txt_edit.delete(1.0, tk.END)
    for _ in range(10):
        txt_edit.insert(tk.END, f"\nmessage should be printed out one by one")
        # do something here
        time.sleep(0.5)
        window.update() # show changes
        # job done 
我建议删除
时间
模块。您可以改用
计时器
。此外,还要考虑
while循环
。您可能希望在应用程序中使用
多线程
。下面是一个简单的
计时器
对象和实现:

class Timer:
    # --- Timer object ---
    def __init__(self):
        self.start_time = None
        self.on = False

    def start(self):
        # start counting
        self.start_time = time.time()
        self.on = True

    def value(self):
        # --- return current value ---
        if self.on:
            return time.time() - self.start_time
        else:
            return 0

    def stop(self):
        # --- stop counting ---
        self.__init__()

def start():
    txt_edit.delete(1.0, tk.END)
    msg_count = 0
    timer = Timer()
    timer.start()
    while msg_count != 10:
        window.update()
        if timer.value() > 0.5:
            txt_edit.insert(tk.END, f"\nmessage should be printed out one by one")
            timer.start()
            msg_count += 1
    timer.stop()

这回答了你的问题吗?在time.sleep(0.5)之前添加
txt\u edit.update()
,谢谢您的帮助。这个问题的答案不是我想要的。@acw1668,谢谢你的帮助。这个有效!感谢您的建议和解决方案!时间模块是我想要模拟处理的东西。我想说明的是,信息并没有一个接一个地显示出来。该部分实际上不在应用程序代码中。但是谢谢你的好意推荐!window.update()可以工作!谢谢