【问题标题】:Python GTK: label.set_text() doesn't work as expectedPython GTK:label.set_text() 不能按预期工作
【发布时间】:2021-02-26 08:36:45
【问题描述】:

[更新:我在下面回答并解释得更好]

测试用例——这将创建一个按钮和一个标签。单击按钮后,我希望标签文本立即更改为“11”,两秒钟后更改为“22”。然而,虽然print(self.msg.get_text()) 会立即打印出预期的结果,但标签直到超时后才会更新。

#!/usr/bin/python
import gi, time
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class MyWindow(Gtk.Window):
  def __init__(self):
    Gtk.Window.__init__(self, title="test")

    self.grid = Gtk.Grid()
    self.add(self.grid)
    self.grid.set_border_width(10)

    self.button = Gtk.Button.new_with_label("change label")
    self.button.connect("clicked", self.change_label)
    self.grid.attach(self.button, 0, 0, 1, 1)

    self.label = Gtk.Label(label = '00')
    self.grid.attach(self.label, 0, 1, 1, 1)

  def change_label(self, button):
    self.label.set_text('11')
    print(self.label.get_text())

    time.sleep(2)

    self.label.set_text('22')

win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

【问题讨论】:

    标签: python user-interface gtk pygtk


    【解决方案1】:

    通过运行time.sleep(),您将阻塞主线程,UI 也在其中运行。由于它已被阻止,因此 UI 无法执行必要的工作来实际呈现您对标签所做的更改。

    要以非阻塞方式更改标签,您可以使用 API,例如 GLib.timeout_add_seconds()

    【讨论】:

    • 谢谢你,这有帮助,看看我的回答。
    【解决方案2】:

    我没有很好地解释自己——sleep() 代表对我正在处理的脚本中所需的服务器的调用。根据 Niels 的建议,我更改了示例以使其更清晰:

    #!/usr/bin/python
    import gi, time
    gi.require_version("Gtk", "3.0")
    from gi.repository import Gtk
    from gi.repository import GLib
    
    class MyWindow(Gtk.Window):
      def __init__(self):
        Gtk.Window.__init__(self, title="test")
    
        self.grid = Gtk.Grid()
        self.add(self.grid)
        self.set_border_width(15)
        self.set_default_size(300, 100)
    
        self.button = Gtk.Button.new_with_label("connect to server")
        self.button.connect("clicked", self.change_label)
        self.grid.attach(self.button, 0, 0, 1, 1)
    
        self.label = Gtk.Label(label = '')
        self.grid.attach(self.label, 0, 1, 1, 1)
    
      def connect_to_server(self):
        time.sleep(2) # placeholder for a server call waiting for response
        self.label.set_text('Success, server stuff done!')
        return False
    
      def change_label(self, button):
        self.label.set_text('Please wait...')
        GLib.timeout_add(20, self.connect_to_server) # unreliable with 10 or less
    
    win = MyWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()
    

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多