Python GTK:label.set_text() 没有按预期工作
Python GTK: label.set_text() doesn't work as expected
[更新:我在下面回答并解释得更好]
测试用例 -- 这将创建一个按钮和一个标签。单击按钮后,我希望标签文本立即更改为“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()
通过 运行 time.sleep()
,您阻塞了主线程,其中 UI 也是 运行。由于它被阻止,UI 无法执行必要的工作来实际呈现您对标签所做的更改。
要以非阻塞方式更改标签,您可以使用 API 例如 GLib.timeout_add_seconds()
。
我没有很好地解释自己 --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()
[更新:我在下面回答并解释得更好]
测试用例 -- 这将创建一个按钮和一个标签。单击按钮后,我希望标签文本立即更改为“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()
通过 运行 time.sleep()
,您阻塞了主线程,其中 UI 也是 运行。由于它被阻止,UI 无法执行必要的工作来实际呈现您对标签所做的更改。
要以非阻塞方式更改标签,您可以使用 API 例如 GLib.timeout_add_seconds()
。
我没有很好地解释自己 --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()