将wxPython类中的函数移动到不同线程的最简单方法是什么?

时间:2013-03-22 17:01:47

标签: python multithreading wxpython

我对Python比较陌生,但我正在使用它来破解一些自动化。我在使用Classes时遇到了一些麻烦,以及内部函数如何与外部函数对话。我的真正目标是从现有函数创建一个线程,而不需要重写我的大部分代码。

这是我目前的型号。我有一个超类AppWindow(wx.Frame),其中定义了许多函数。

InitUI创建接口并初始化变量。 ProcessComputers联系不同的工作站以收集一些信息。这很大程度上依赖于我在此应用程序基于控制台时编写的模块。 还有其他各种各样的错误。这些功能并不值得一试。

这显然对GUI不好,因为在屏幕可以刷新和接受事件之前,所有内容都依赖于那些进程。

由于ProcessComputer已经与我的UI函数分开了,我想知道将这些函数移动到一个单独的线程中最简单的方法是什么,而不必重写和重命名对象和变量?

我尝试按照建议here创建一个新类。问题是当我创建两个新类,并将ProcessComputer的内容移到CountEvent类时,一切都破了。我无法再从AppWindow更新self.textField,也无法使用AppWindow.textField来引用它。我没有任何变量可供新类访问。有没有更好的方法将此函数移动到自己的类中,而无需重写太多当前正在运行的代码?

如果没有,那么重写ProcessComputer内容的最佳方式是什么,这样他们仍然可以使用AppWindow中的其他代码?

1 个答案:

答案 0 :(得分:0)

我会把ProcessComputer函数保留在它所在的位置并让你的GUI调用它。但是把它的内容放在一个基于Thread的类中的函数中。然后当你需要更新GUI时,你必须调用一个wxPython的线程安全方法:wx.CallAfter,wx.CallLater或wx.PostEvent。

以下是一些很好的资源:

这是你的线程类的样子:

 ########################################################################
class TestThread(Thread):
    """Test Worker Thread Class."""

    #----------------------------------------------------------------------
    def __init__(self, wxObject):
        """Init Worker Thread Class."""
        Thread.__init__(self)
        self.wxObject = wxObject
        self.start()    # start the thread

    #----------------------------------------------------------------------
    def run(self):
        """Run Worker Thread."""
        # This is the code executing in the new thread.
        for i in range(6):
            time.sleep(10)
            amtOfTime = (i + 1) * 10
            wx.PostEvent(self.wxObject, ResultEvent(amtOfTime))
        time.sleep(5)
        wx.PostEvent(self.wxObject, ResultEvent("Thread finished!"))

其余代码可以类似于第二个链接中的示例。或者您可以使用维基的第一个链接来查看其他几种方法。