Python回显终端输出——无缓冲

Python回显终端输出——无缓冲,python,tkinter,Python,Tkinter,我想做一个图形用户界面。该程序在设备上启用VNC。所以,当我按下GO按钮时,它将以“启用VNC…”开始,启用需要几秒钟。完成后,在上显示“成功”消息。我在候机楼看到这个 我正试图在GUI上做同样的事情。“启用vnc”消息直到最后才出现。它与“成功”消息一起出现。这就像它将所有GUI输出消息缓冲在一起,然后最终将其全部吐出 以下是我所拥有的: def actions(): # Enable VNC if action_VNC.get(): print("Enabling VNC.

我想做一个图形用户界面。该程序在设备上启用VNC。所以,当我按下GO按钮时,它将以“启用VNC…”开始,启用需要几秒钟。完成后,在上显示“成功”消息。我在候机楼看到这个

我正试图在GUI上做同样的事情。“启用vnc”消息直到最后才出现。它与“成功”消息一起出现。这就像它将所有GUI输出消息缓冲在一起,然后最终将其全部吐出

以下是我所拥有的:

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