0

私はPythonに比較的慣れていませんが、いくつかの自動化をハックするために使用しています。クラスと、内部の関数が外部の関数と通信する方法に少し問題があります。私の本当の目標は、ほとんどのコードを書き直すことなく、既存の関数からスレッドを作成することです。

これが私の現在のモデルです。スーパークラスAppWindow(wx.Frame)があり、その中に多くの関数が定義されています。

InitUIインターフェイスを作成し、変数を初期化します。 ProcessComputersいくつかの情報を収集するために、さまざまなワークステーションに手を差し伸べます。これは、このアプリケーションがコンソールベースだったときに私が書いたモジュールに大きく依存しています。他にも色々あります。呼び出す価値のない関数。

画面が更新されてイベントを受け入れる前に、これらのプロセスが完了することにすべてが依存しているため、これは明らかに GUI にとって悪いことです。

は既に UI 関数から分離されているためProcessComputer、オブジェクトと変数を書き直して名前を変更することなく、これらの関数を別のスレッドに移動する最も簡単な方法は何だろうか?

ここで提案されているように、新しいクラスを作成しようとしました。問題は、2 つの新しいクラスを作成し、内臓をProcessComputerCountEvent クラスに移動したときに、すべてが壊れたことです。self.textField を更新することも、AppWindow.textFieldAppWindowを使用してそれを参照することもできなくなりました。私の変数はどれも新しいクラスにアクセスできませんでした。現在動作しているコードをあまり書き直さずに、この関数を独自のクラスに移動するより良い方法はありますか?

そうでない場合、 の内臓を書き換えて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!"))

コードの残りの部分は、2 番目のリンクの例と同様です。または、wiki への最初のリンクを使用して、他のいくつかのアプローチを確認することもできます。

于 2013-03-22T17:32:48.640 に答える