为什么它必须是GUI线程的上下文?

时间:2012-05-12 19:59:47

标签: python multithreading user-interface wxpython

这是wxPython源代码文件的摘录:

    """
    Create the output window if needed and write the string to it.
    If not called in the context of the gui thread then uses
    CallAfter to do the work there.
    """        

这在内部如何运作?为什么GUI相关的调用不是直接由其他线程进行的呢?

您是否知道图表或其他以简短的方式解释此类GUI概念的内容?

我很乐意,如果我不必阅读一本小说来理解这个问题,那么我就知道如何选择我的设计。


修改

以下是讨论:

Diagram

1 个答案:

答案 0 :(得分:1)

这很简单。想想一个队列,wxPython有它自己的内部事件队列,你导致wxPython在你的app上调用MainLoop时处理它,它将从主线程调用。因此,每当您修改窗口小部件时,它都不会干扰正在处理事件队列的MainLoop。但是当你添加线程时,多于一个线程正在操纵GUI和/或事件队列和GUI访问不同步。 这就是wx.CallAfter变得有用的地方,它只是向Event-Queue添加一个伪事件,它将调用你指定的函数,因此它将从Main-Thread执行,只有一个Thread正在访问GUI。请注意,当您传递的函数需要一段时间才能返回时,GUI将会冻结,因为不再处理任何事件(如移动或点击)。

相关:http://wiki.wxpython.org/LongRunningTasks