使用具有长时间功能的Gtk.spinner

时间:2013-05-21 22:17:57

标签: python gtk pygobject

我正在尝试在python中使用Pygobject来运行gtk.spinner。最重要的是我使用此元素向用户显示正在进行的长时间操作。问题是,在执行此功能时,微调器会停止。

代码在这里:

.....
def create_image(self,spinner):
    ....
    spinner.start()
    # Heavy function
    spinner.stop()
.....

这不起作用。我会接受一些帮助,谢谢!

1 个答案:

答案 0 :(得分:4)

您的繁重功能需要偶尔让GUI处理累积事件。例如,您偶尔可以运行:

while gtk.events_pending():
    gtk.main_iteration()

另一个选项是重函数在一个单独的线程中运行,让主线程处理事件并旋转微调器。在这种情况下,您需要将create_image函数重新设计为异步。例如:

def create_image(self, spinner, finishcb):
    spinner.start()

    def thread_run():
        # call heavy here
        heavy_ret = heavy()
        gobject.idle_add(cleanup, heavy_ret)

    def cleanup(heavy_ret):
        spinner.stop()
        t.join()
        finishcb(heavy_ret)

    # start "heavy" in a separate thread and immediately
    # return to mainloop
    t = threading.Thread(thread_run)
    t.start()

现在,您需要向其传递一个回调,而不是调用create_image,该回调将在映像准备好时调用。即,而不是:

image = self.create_image(spinner)
你写道:

self.create_image(spinner, self.store_created_image)