我的部分代码如下:
def get_songs():
label6.configure(text='Wait')
os.system('/home/norman/my-startups/grabsongs')
label6.configure(text='Done')
标签不会在第一个.configure()
更新,而是在第二个更新。
除非我在第一个错误之后立即引起一个故意的错误,这时它被更新,然后程序终止。
系统调用大约需要2分钟才能完成,因此似乎没有时间显示第一个调用。在
我使用的是python2.7.6
有人知道为什么吗?在
我猜你在用
Tkinter
。如果是这样,正如@albert刚才建议的那样,您需要调用label.update_idletasks()
或label.update()
来告诉Tkinter刷新显示。在作为重现问题的一个非常粗糙的例子,让我们制作一个程序,它将:
例如:
注意,永远不会显示“Wait”。在
要解决这个问题,让我们在初始设置文本之后调用
^{pr2}$update_idletasks()
:至于为什么会这样,实际上是因为Tkinter没有时间更新标签。在
调用
configure
不会自动强制刷新显示,它只是在下次空闲时将其排队。因为您会立即调用一些东西来停止mainloop的执行(调用一个可执行文件并强制python停止直到它完成),Tkinter永远没有机会处理对标签的更改。在请注意,当gui显示“Wait”(当您的进程/睡眠正在运行时),它不会对调整大小等做出响应,Python已经停止了执行,直到另一个进程完成运行。在
要解决这个问题,请考虑使用}。然后,您将需要对返回的管道进行轮询,以查看子进程是否已完成。在
subprocess.Popen
(或类似的东西)而不是{作为一个例子(我还将它移到一个类中,以防止作用域变得过于混乱):
这里的关键区别在于,我们可以在等待外部进程完成时调整窗口大小/移动窗口/与窗口交互。还要注意,我们从不需要调用
update_idletasks
/update
,因为Tkinter现在确实有空闲时间来更新显示。在相关问题 更多 >
编程相关推荐