我在试着做一个图形用户界面。该程序在设备上启用VNC。所以当我按下GO按钮时,它会以"Enabling VNC...“开始。需要几秒钟才能启用。之后是在完成时的"sucCess“消息。我在航站楼看到了这个。
我正试着在GUI上做同样的事情。直到最后才出现"enabling 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,而不是等到最后才一起输出所有内容。它已经在终端上做到了这一点。有什么想法?
发布于 2020-09-28 23:47:01
它有点缓冲了。GUI通过“事件驱动”编程来工作,这意味着在函数完成之前,可见窗口不会更新。这意味着您不能在GUI中创建需要很长时间才能完成的函数。
解决这个问题的一种方法是使用threading模块。
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()发布于 2020-09-29 20:50:17
我发现window.update_idletasks()对我来说工作得很好。因此,我的输出代码如下所示:
outText.insert(tk.END, msg_seconds)
window.update_idletasks()https://stackoverflow.com/questions/64104836
复制相似问题