Python回显终端输出——无缓冲
我想做一个图形用户界面。该程序在设备上启用VNC。所以,当我按下GO按钮时,它将以“启用VNC…”开始,启用需要几秒钟。完成后,在上显示“成功”消息。我在候机楼看到这个 我正试图在GUI上做同样的事情。“启用vnc”消息直到最后才出现。它与“成功”消息一起出现。这就像它将所有GUI输出消息缓冲在一起,然后最终将其全部吐出 以下是我所拥有的:Python回显终端输出——无缓冲,python,tkinter,Python,Tkinter,我想做一个图形用户界面。该程序在设备上启用VNC。所以,当我按下GO按钮时,它将以“启用VNC…”开始,启用需要几秒钟。完成后,在上显示“成功”消息。我在候机楼看到这个 我正试图在GUI上做同样的事情。“启用vnc”消息直到最后才出现。它与“成功”消息一起出现。这就像它将所有GUI输出消息缓冲在一起,然后最终将其全部吐出 以下是我所拥有的: def actions(): # Enable VNC if action_VNC.get(): print("Enabling VNC.
def actions():
# Enable VNC
if action_VNC.get():
print("Enabling VNC...")
msg_initVNC = "Enabling VNC..." + "\n"
outText.insert(tk.END, msg_initVNC)
#DO STUFF HERE
print('Success. VNC enabled.')
print('########')
msg_outVNC = 'Success. VNC enabled.' + "\n" + '########' +"\n"
outText.insert(tk.END, msg_outVNC)
window.mainloop()
这里的#DO元素启用了VNC,它可以正常工作。大约需要3-5秒的时间。我希望程序在应该的时候将打印文本输出到GUI,而不是等到最后才将所有内容一起输出。它已经在终端上执行此操作。思想?有点缓冲了。GUI通过“事件驱动”编程工作,这意味着在函数完成之前,可视窗口不会更新。这意味着您不能在GUI中创建需要很长时间才能完成的函数 解决这个问题的一种方法是使用
线程化模块
from threading import Thread
def actions():
# Enable VNC
if action_VNC.get():
print("Enabling VNC...")
msg_initVNC = "Enabling VNC..." + "\n"
outText.insert(tk.END, msg_initVNC)
t = Thread(target=do_stuff, daemon=True)
t.start() # start the worker function in the background
root.bind("<<TaskDone>>", task_done) # listen for the task done event
def do_stuff():
#DO STUFF HERE
root.event_generate("<<TaskDone>>") # send the task done event
def task_done(*args):
print('Success. VNC enabled.')
print('########')
msg_outVNC = 'Success. VNC enabled.' + "\n" + '########' +"\n"
outText.insert(tk.END, msg_outVNC)
window.mainloop()
从线程导入线程
def actions():
#启用VNC
如果操作_VNC.get():
打印(“启用VNC…”)
msg_initVNC=“启用VNC…”+“\n”
outText.insert(tk.END,msg_initVNC)
t=Thread(target=do\u stuff,daemon=True)
t、 start()#在后台启动辅助函数
root.bind(“,task_done)#侦听task done事件
def do_stuff():
#在这里做事
root.event_generate(“”)#发送任务完成事件
def任务_完成(*参数):
打印('Success.VNC enabled')
印刷品
msg_outVNC='成功。已启用VNC。“+”\n“+”\n”
outText.insert(tk.END,msg_outVNC)
window.mainloop()
我发现窗口。update\u idletasks()
对我来说非常有效。因此,我的输出代码如下所示:
outText.insert(tk.END, msg_seconds)
window.update_idletasks()
回调名称action\u done
是否应该task\u done
?