标签.配置有时候有用为什么?

2024-10-01 09:24:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我的部分代码如下:

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

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

我使用的是python2.7.6

有人知道为什么吗?在


Tags: 代码texthomegetosconfiguremydef
1条回答
网友
1楼 · 发布于 2024-10-01 09:24:19

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

作为重现问题的一个非常粗糙的例子,让我们制作一个程序,它将:

  1. 等一秒钟
  2. 做点什么(睡眠2秒)并将文本更新为“wait”
  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()

注意,永远不会显示“Wait”。在

要解决这个问题,让我们在初始设置文本之后调用update_idletasks()

^{pr2}$

至于为什么会这样,实际上是因为Tkinter没有时间更新标签。在

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

请注意,当gui显示“Wait”(当您的进程/睡眠正在运行时),它不会对调整大小等做出响应,Python已经停止了执行,直到另一个进程完成运行。在

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

作为一个例子(我还将它移到一个类中,以防止作用域变得过于混乱):

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现在确实有空闲时间来更新显示。在

相关问题 更多 >