【问题标题】:PyGObject (Glade) Window Never Showing (Multithreaded)PyGObject(Glade)窗口从不显示(多线程)
【发布时间】:2014-10-21 05:44:56
【问题描述】:

为了让这个进程多线程化,我已经奋斗了三个小时,这样我就可以显示一个进度框了。我终于让它工作了,因为该过程按预期完成,并且所有函数都调用了,包括更新窗口上的进度指示器的函数。

但是,窗口从未真正显示。这是在 Glade 中设计的 PyGObject 接口。我不开心。

def runCompile(obj):
    compileWindow = builder.get_object("compilingWindow")
    compileWindow.show_all()

    pool = ThreadPool(processes=1)
    async_result = pool.apply_async(compileStrings, ())

    output = async_result.get()
    #output = compileStrings() #THIS IS OLD

    compileWindow.hide()

    return output

正如我所提到的,一切正常,除了窗口没有出现。即使我消除了 compileWindow.hide() 命令,在该过程完成之前,窗口也不会显示。事实上,整个愚蠢的程序都会冻结,直到进程完成。

我已经走到了尽头。帮忙?

(顺便说一句,使用生成器的“推荐”过程不起作用,因为我必须从“漫长的过程”中得到回报。)

【问题讨论】:

    标签: python multithreading python-3.x pygobject


    【解决方案1】:

    我不是 pyGobject 专家,我不太了解您的代码。我认为你应该多发帖。为什么要在函数中调用构建器?您可以在 GUI 的 init 中调用它吗?

    无论如何..您似乎遇到了常见的多线程问题..

    您在启动时使用的是GObject.threads_init()Gdk.threads_init() 吗?

    然后,如果你想从一个线程中显示一个窗口,你需要使用Gdk.threads_enter()Gdk.threads_leave()

    here 是一个有用的文档

    【讨论】:

    • 不完全是我的程序的目的(不是你可能知道的),但是,同样合理的建议。请参阅下面的答案以获取完整源代码的链接。
    【解决方案2】:

    我更改了项目的整体流程,因此可能会影响它。然而,Gtk 必须有机会通过自己的主循环,通过...

    if Gtk.events_pending():
        Gtk.main_iteration()
    

    在这种情况下,我只想调用一次,以确保程序不会挂起。

    (完整的程序源代码可以在SourceForge 上找到。截至本文发布时,该函数位于第 372 行,在函数 compileModel() 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多