Python 3.x Python tkinter,如何逐个显示消息
我正在使用tkinter(Python版本3.9)构建一个应用程序。在应用程序中,我希望消息可以显示一个一个根据程序的进展。但是,我的应用程序现在只能同时打印所有消息 示例代码如下所示: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
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()可以工作!谢谢