GObject.idle_add(func),我的程序挂起

时间:2014-09-22 23:27:12

标签: python multithreading pygtk gobject

我不知道为什么我的程序会挂起,我已经阅读了几个关于此的主题。

结果是当我点击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'

1 个答案:

答案 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'