0

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

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

InitUI创建接口并初始化变量。 ProcessComputers伸手去不同的工作站收集一些信息。这在很大程度上依赖于我在此应用程序基于控制台时编写的模块。还有各种其他杂项。真正不值得调用的功能。

这显然对 GUI 不利,因为一切都依赖于在屏幕刷新和接受事件之前完成的那些进程。

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

我已经尝试按照这里的建议创建一个新类。问题是当我创建了两个新类,并将胆量ProcessComputer转移到 CountEvent 类时,一切都崩溃了。我无法再更新 self.textField,AppWindow也无法使用 AppWindow.textField 引用它。新类无法访问我的所有变量。有没有更好的方法将此函数移动到它自己的类中,而无需重写太多当前正在工作的代码?

如果不是,那么重写内脏的最佳方法是什么,ProcessComputer以便他们仍然使用其中的其余代码AppWindow

4

1 回答 1

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!"))

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

于 2013-03-22T17:32:48.640 回答