我不知道为什么我的程序会挂起,我已经阅读了几个关于此的主题。
结果是当我点击Config_Window_Button1 时,我的 Config_Window冻结一段时间, time.sleep()
。
然后出现Network_Window,但 GObject.idle_add()
似乎只运行一次(分数调整为0.25);我无法看到该进度条中的任何移动,感兴趣的是 print("def pulse running")
定期运行。
所以:
1) 为什么Config_Window冻结了S秒,其中time.sleep(S)在GObject.idle_add()之后?
2) 为什么我的GUI没有更新?
GObject.threads_init()
builder = Gtk.Builder()
builder.add_from_file('UI2.glade')
builder.get_object('Config_Window').show()
progressbar = builder.get_object('Progressbar1')
progressbar.set_inverted(True)
fraction = 0.0
builder.get_object('Config_Window_Button1').connect('clicked', collega_GUI)
def collega_GUI(widget, args=()):
builder.get_object('boxNetwork').show_all()
builder.get_object('Network_Window').show()
progressbar.set_pulse_step(0.25)
pulse()
print 'collega_GUI has ended'
def pulse():
while True:
GObject.idle_add(progressbar.pulse)
time.sleep(1)
print 'def pulse running'
答案 0 :(得分:0)
问题是while True
函数中有pulse
循环。这意味着控件永远不会离开pulse
并返回到您的事件循环,这意味着GTK永远不会真正更新UI。您可以通过重复安排pulse
以使用timeout_add
运行而不是使用无限循环来解决此问题。
def pulse():
progress_bar.pulse()
GObject.timeout_add(1000, pulse) # pulse it again in 1 second.
print 'def pulse running'
修改强>
看起来你实际上是在尝试使用多个线程,在这种情况下你可以按原样保留pulse
,只要你在后台线程中实际启动它:
def collega_GUI(widget, args=()):
builder.get_object('boxNetwork').show_all()
builder.get_object('Network_Window').show()
progressbar.set_pulse_step(0.25)
self.pulse_thread = threading.Thread(target=pulse)
self.pulse_thread.start()
print 'collega_GUI has ended'
def pulse():
while True:
GObject.idle_add(progressbar.pulse)
time.sleep(1)
print 'def pulse running'