On-Demand Python Thread Start/Join Freezing Up from wxPython GUI
- by HokieTux
I'm attempting to build a very simple wxPython GUI that monitors and displays external data.  There is a button that turns the monitoring on/off.  When monitoring is turned on, the GUI updates a couple of wx StaticLabels with real-time data.  When monitoring is turned off, the GUI idles.
The way I tried to build it was with a fairly simple Python Thread layout.  When the 'Start Monitoring' button is clicked, the program spawns a thread that updates the labels with real-time information.  When the 'Stop Monitoring' button is clicked, thread.join() is called, and it should stop.
The start function works and the real-time data updating works great, but when I click 'Stop', the whole program freezes.  I'm running this on Windows 7 64-bit, so I get the usual "This Program has Stopped Responding" Windows dialog.
Here is the relevant code:
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()
I'm sure there is a better way to do this, but I'm fairly new to GUI programming and Python threads, and this was the first thing I came up with.
So, why does clicking the button to stop the thread make the whole thing freeze up?