外部データを監視および表示する非常に単純な wxPython GUI を構築しようとしています。モニタリングのオン/オフを切り替えるボタンがあります。監視がオンになると、GUI はリアルタイム データで 2 つの wx StaticLabels を更新します。モニタリングがオフになると、GUI はアイドル状態になります。
私がそれを構築しようとした方法は、かなり単純な Python スレッド レイアウトを使用することでした。[監視の開始] ボタンをクリックすると、プログラムはリアルタイムの情報でラベルを更新するスレッドを生成します。「監視の停止」ボタンをクリックすると、thread.join() が呼び出され、停止するはずです。
開始機能は機能し、リアルタイムのデータ更新はうまく機能しますが、[停止] をクリックすると、プログラム全体がフリーズします。これを Windows 7 64 ビットで実行しているため、通常の「このプログラムは応答を停止しました」という Windows ダイアログが表示されます。
関連するコードは次のとおりです。
class MonGUI(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
...
... other code for the GUI here ...
...
# Create the thread that will update the VFO information
self.monThread = Thread(None, target=self.monThreadWork)
self.monThread.daemon = True
self.runThread = False
def monThreadWork(self):
while self.runThread:
...
... Update the StaticLabels with info
... (This part working)
...
# Turn monitoring on/off when the button is pressed.
def OnClick(self, event):
if self.isMonitoring:
self.button.SetLabel("Start Monitoring")
self.isMonitoring = False
self.runThread = False
self.monThread.join()
else:
self.button.SetLabel("Stop Monitoring")
self.isMonitoring = True
# Start the monitor thread!
self.runThread = True
self.monThread.start()
これを行うためのより良い方法があると確信していますが、私は GUI プログラミングと Python スレッドにかなり慣れていないため、これが最初に思いついたものでした。
では、スレッドを停止するボタンをクリックすると、全体がフリーズするのはなぜでしょうか?