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

Python 为什么它必须是GUI线程的上下文?,python,multithreading,user-interface,wxpython,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相关调用很重要 你知道有没有一个图

这是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概念

如果我不必读一本小说来理解这个问题,从而知道如何选择我的设计,我会很高兴


编辑:

这是下面的讨论:


那很容易。想象一个队列,wxPython有它自己的内部事件队列,当在
应用程序
上调用MainLoop(将从主线程调用)时,您会让wxPython处理它。因此,无论何时修改小部件,它都不会干扰正在处理事件队列的MainLoop。但是,当您添加线程时,不止一个线程正在操作GUI和/或事件队列,并且GUI访问不同步。 这就是wx.CallAfter变得有用的地方,它只是向事件队列添加一个伪事件,该事件将调用指定的函数,因此它将从主线程执行,只有一个线程正在访问GUI。注意,当传递的函数需要一段时间才能返回时,GUI将冻结,因为不再处理任何事件(如移动或单击)


相关:

这很容易。想象一个队列,wxPython有它自己的内部事件队列,当在
应用程序
上调用MainLoop(将从主线程调用)时,您会让wxPython处理它。因此,无论何时修改小部件,它都不会干扰正在处理事件队列的MainLoop。但是,当您添加线程时,不止一个线程正在操作GUI和/或事件队列,并且GUI访问不同步。 这就是wx.CallAfter变得有用的地方,它只是向事件队列添加一个伪事件,该事件将调用指定的函数,因此它将从主线程执行,只有一个线程正在访问GUI。注意,当传递的函数需要一段时间才能返回时,GUI将冻结,因为不再处理任何事件(如移动或单击)


相关:

不需要GUI代码来支持从多个线程调用。要做到这一点,需要将各种同步代码添加到GUI框架中。因此,几乎所有的GUI框架都坚持客户端只从GUI线程调用。作为框架的客户,做出决策的原因几乎无关紧要。事实就是这样,GUI代码不需要支持从多个线程调用。要做到这一点,需要将各种同步代码添加到GUI框架中。因此,几乎所有的GUI框架都坚持客户端只从GUI线程调用。作为框架的客户,做出决策的原因几乎无关紧要。就是这样。“而且GUI访问不同步。”-你能告诉我为什么不同步吗?会不会是太多的努力或诸如此类的事情?顺便说一句,谢谢你的解释。对不起,我不能告诉你为什么它不同步而不猜测。如果你想要答案,你可以在wxPython邮件列表上询问,RobinD可以回答这个问题。你的解释有助于我的理解。但不知怎的,我已经到了什么都不懂的地步,我想:那么像StaticText.GetLabel这样的方法会触发以处理主循环中的消息,或者怎么样?请澄清这一点好吗?不管其他线程是否访问GUI(以任何形式)或事件队列,它们都是不同步的(例如,使用
线程
模块中的锁)。想想一个函数,它更新TextCtrl中的文本,当它更新时,另一个线程调用GetValue,您希望GetValue返回什么?之前的文本、已更新的文本还是完整的新文本?后一种情况是,如果GUI访问是同步的,但没有同步,一切都可能发生。好的,我在关键字atomic的上下文中知道这一点(如果我的问题让你感到困惑:我之所以来到这个主题是因为。在那里,我的GUI线程被join暂停,然后调用GetLabel。)请看上面我上传的图片。你同意吗?“GUI访问不同步。”-你能告诉我为什么不同步吗?会不会是太多的努力或诸如此类的事情?顺便说一句,谢谢你的解释。对不起,我不能告诉你为什么它不同步而不猜测。如果你想要答案,你可以在wxPython邮件列表上询问,RobinD可以回答这个问题。你的解释有助于我的理解。但不知怎的,我已经到了什么都不懂的地步,我想:那么像StaticText.GetLabel这样的方法会触发以处理主循环中的消息,或者怎么样?请澄清这一点好吗?不管其他线程是否访问GUI(以任何形式)或事件队列,它们都是不同步的(例如,使用
线程
模块中的锁)。想想一个函数,它更新TextCtrl中的文本,当它更新时,另一个线程调用GetValue,您希望GetValue返回什么?之前的文本、已更新的文本还是完整的新文本?后一种情况是,如果GUI访问是同步的,但没有同步,一切都可能发生。好的,我在关键字atomic的上下文中知道这一点(如果我的问题让你感到困惑:我之所以来到这个主题是因为。在那里,我的GUI线程被join暂停,然后调用GetLabel。)请看上面我上传的图片。你能同意吗?