gpt4 book ai didi

python - label.configure 有时有效,为什么?

转载 作者:行者123 更新时间:2023-12-01 04:31:32 25 4
gpt4 key购买 nike

我的部分代码如下:

def get_songs():
label6.configure(text='Wait')
os.system('/home/norman/my-startups/grabsongs')
label6.configure(text='Done')

标签在第一个 .configure() 时未更新,但在第二个时更新。除非我在第一个错误之后立即造成故意错误,此时它会被更新,然后程序终止。系统调用大约需要 2 分钟才能完成,因此似乎没有时间显示第一个。

我使用的是Python 2.7.6

有谁知道为什么吗?

最佳答案

我猜您正在使用 Tkinter。如果是这样,正如@albert刚刚建议的那样,您需要调用label.update_idletasks()label.update()来告诉Tkinter刷新显示。

作为重现您的问题的一个非常粗略的示例,让我们编写一个程序来:

  1. 等待 1 秒
  2. 做某事(休眠 2 秒)并将文本更新为“等待”
  3. 之后显示“完成”

例如:

import Tkinter as tk
import time

root = tk.Tk()
label = tk.Label(root, text='Not waiting yet')
label.pack()

def do_stuff():
label.configure(text='Wait')
time.sleep(2)
label.configure(text='Done')

label.after(1000, do_stuff)
tk.mainloop()

请注意,“等待”永远不会显示。

为了解决这个问题,我们在最初设置文本后调用 update_idletasks():

import Tkinter as tk
import time

root = tk.Tk()
label = tk.Label(root, text='Not waiting yet')
label.pack()

def do_stuff():
label.configure(text='Wait')
label.update_idletasks()
time.sleep(2)
label.configure(text='Done')

label.after(1000, do_stuff)
tk.mainloop()
<小时/>

至于为什么会出现这种情况,实际上是因为 Tkinter 没有时间更新标签。

调用configure不会自动强制刷新显示,它只是在下次空闲时排队。因为您立即调用将停止执行主循环的内容(调用可执行文件并强制 python 停止直到完成),所以 Tkinter 永远没有机会处理对标签的更改。

请注意,当 gui 显示“等待”(当您的进程/ sleep 正在运行时)时,它不会响应调整大小等。Python 已停止执行,直到其他进程完成运行。

要解决这个问题,请考虑使用 subprocess.Popen (或类似的东西)而不是 os.system。然后,您需要定期轮询返回的管道以查看子进程是否已完成。

作为示例(我还将其移至一个类中,以防止范围界定过于困惑):

import Tkinter as tk
import subprocess

class Application(object):
def __init__(self, parent):
self.parent = parent
self.label = tk.Label(parent, text='Not waiting yet')
self.label.pack()
self.parent.after(1000, self.do_stuff)

def do_stuff(self):
self.label.configure(text='Wait')
self._pipe = subprocess.Popen(['/bin/sleep', '2'])
self.poll()

def poll(self):
if self._pipe.poll() is None:
self.label.after(100, self.poll)
else:
self.label.configure(text='Done')

root = tk.Tk()
app = Application(root)
tk.mainloop()

这里的主要区别是,我们可以在等待外部进程完成时调整窗口大小/移动/与窗口交互。另请注意,我们从来不需要调用 update_idletasks/update,因为 Tkinter 现在确实有空闲时间来更新显示。

关于python - label.configure 有时有效,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32339380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com