1

いくつかのパラメーターを取り、いくつかのタスクを実行する Python 関数を取得しました (theFunc と呼びましょう)。theFunc が実行されている間、内部変数 resultsMessage はどんどん多くの行を取得しており、実行の最後にそれを GUI に表示します。理想的には、theFunc の実行が終了した後ではなく、実行時に GUI 上でresultingMessage を表示および更新し、theFunc を GUI のもので汚染することなく実行したいと考えています (すでに十分に複雑です)。それを行う最良の方法は何ですか?

私が考えることができる2つの可能な方法(どちらもかなり大げさです):

  1. 2 つのスレッドを用意します。1 つは theFunc を実行し、resultingMessage を変数/ファイルに書き込みます。もう 1 つは、この変数/ファイルをチェックして GUI を更新します。
  2. resultsMessage に行を追加する代わりに、何らかの「ストリーム」を GUI 要素に追加します。「ストリーム」に行を追加すると、GUI が更新されます。

私はそれを行う従来の方法があるべきだと思います。

環境: CPython 2.7、Win XP、WXPython

4

2 に答える 2

1

スレッドを使用する必要があります。wxPython には、wx.CallAfter、wx.CallLater、wx.PostEvent などのスレッドセーフなメソッドがいくつか用意されています。これらを pubsub と組み合わせてメッセージを送信することもできます! あなたの場合、wx メソッドを wx.CallAfter に渡し、表示したいテキストがあれば問題なく動作すると思います。

于 2012-11-16T14:22:32.550 に答える
1

Mike Driscoll's answer は、これを行うためにおそらく最も一般的に使用される方法を説明しています。彼のウェブサイトには、より詳細な記事が掲載されています。彼は実際にそこに本当に良い記事をたくさん持っているので、それらをチェックしてください.

これを行う別の方法は、メイン スレッドにタイマーを設定して、キューのメッセージをチェックすることです。initメソッドでキューを設定し、長時間実行される関数を実行するワーカー スレッドに渡します。ワーカーは必要に応じてキューにアイテムを入れ、タイマー イベントに結び付けられた関数がメイン スレッドでメッセージ/データを取得し、GUI などを更新します。短い例を次に示します。

#first 4 lines are the bottom of the __init__ method of the main frame
    self.timer = wx.Timer(self)
    self.timer.Start(250)
    self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)
    self.Bind(wx.EVT_CLOSE, self.onClose)

def onTimer(self, event):
    '''checks for messages in self.q2 (Queue.Queue set up above)'''
    while not self.q2.empty():
        msg, data = self.q2.get()
        self.update(None, msg, data)

def update(self, event, msg, data):
    '''Runs with data returned in self.q2'''
    self.sb.SetStatusText(msg)
    etc, etc . . .

がんばれ、マイク

于 2012-11-17T00:54:33.387 に答える