これはwxPythonのPhoenixフォークにあります。wxPythonスレッドのブロック
私はGUIをブロックしないように、いくつかのスレッドを実行しようとしています。
私のスレッドのうちの2つはうまく動作しますが、もう1つは決してその結果の結果関数を打つことはありません。私はそれが実行されていることを伝えることができます、それはちょうど適切にイベントを投稿するようではありません。
は、ここでの主な計算スレッドの結果関数です:
def on_status_result(self, event):
if not self.panel.progress_bar.GetRange():
self.panel.progress_bar.SetRange(event.data.parcel_count)
self.panel.progress_bar.SetValue(event.data.current_parcel)
self.panel.status_label.SetLabel(event.data.message)
は、ここで私はそれらを結合しています方法は次のとおりです。
from wx.lib.pubsub.core import Publisher
PUB = Publisher()
ここで私が方法結合てる方法は次のとおりです。
def post_event(message, data):
wx.CallAfter(lambda *a: Publisher().sendMessage(message, data=data))
を
ここにスレッドがあります。一つ目は動作しませんが、次の二つの操作を行います。私は/サブスクライブ開始/作成しています方法です。ここ
class Status:
def __init__(self, parcel_count, current_parcel, total, message):
self.parcel_count = parcel_count
self.current_parcel = current_parcel
self.total = total
self.message = message
:
class PrepareThread(threading.Thread):
def __init__(self, notify_window):
threading.Thread.__init__(self)
self._notify_window = notify_window
self._want_abort = False
def run(self):
while not self._want_abort:
for status in prepare_collection(DATABASE, self._previous_id, self._current_id, self._year, self._col_type,
self._lock):
post_event('prepare.running', status)
post_event('prepare.complete', None)
return None
def abort(self):
self._want_abort = True
class SetupThread(threading.Thread):
def __init__(self, notify_window):
threading.Thread.__init__(self)
self._notify_window = notify_window
self._want_abort = False
def run(self):
while not self._want_abort:
do_more_stuff_with_the_database()
return None
def abort(self):
self._want_abort = True
class LatestCollectionsThread(threading.Thread):
def __init__(self, notify_window):
threading.Thread.__init__(self)
self._notify_window = notify_window
self._want_abort = False
def run(self):
while not self._want_abort:
do_stuff_with_my_database()
return None
def abort(self):
self._want_abort = True
prepare_collection
は、次のようになりますStatus
オブジェクトを生成する関数でありますPrepareThread:
MainForm(wx.Form):
prepare_thread = PrepareThread(self)
prepare_thread.start()
self.pub = Publisher()
self.pub.subscribe(self.on_status_result, 'prepare.running')
self.pub.subscribe(self.on_status_result, 'prepare.complete')
def on_status_result(self, event):
if not self.panel.progress_bar.GetRange():
self.panel.progress_bar.SetRange(event.data.parcel_count)
self.panel.progress_bar.SetValue(event.data.current_parcel)
self.panel.status_label.SetLabel(event.data.message)
私はrange(10)
とprepare_collection
をスタブ試してみたが、私はまだ今まで前夜にヒットしません。 ntハンドラ。
こんにちはモルガン申し訳ありません...私はおそらくこれを見直すチャンスを今夜は得られない...ちょうどスーパービジー:/ –
@ヨランそれはすべて良いです。 –
ああダン...申し訳ありません...私は試してみて、あなたの今週末を助けようとします。ちょうど狂った週でした。 –