self-closing window with wxPython

Philip Semanchuk philip at
Fri Sep 17 21:08:16 CEST 2010

On Sep 17, 2010, at 12:05 PM, Jabba Laci wrote:

> Hi,
> I'd like to create a simple alarm application that shows an alarm
> window. The application should shut down automatically after 5
> seconds. The problem is the following:
> * If I keep the mouse outside of the window, the application keeps
> running. Somehow self.Destroy() is not taken into account.
> * If the mouse is over the window and I keep moving it, the window closes.
> I'm using Ubuntu Linux with wxPython 2.8. Below you can find what I have so far.

Hi Laszlo,
It's difficult to help without a complete working example. But I have a few suggestions.

1) Why not call self.parent.Close()? It seems a bit more polite than .Destroy().

2) I saw this in the documentation for Destroy() -- "Frames and dialogs are not destroyed immediately when this function is called -- they are added to a list of windows to be deleted on idle time, when all the window's events have been processed." That might be consistent with what you're seeing. The window you're trying to destroy has no events in its queue. WHen you move the mouse over it, the window processes those mouse events and then wx realizes, "Hey, this window has processed all of its events, and it's on the list of windows to be destroyed. I'd better get rid of it." 

If you're interested in experimenting, find a non-mouse way to force that window to process an event and I'll bet that would have the same effect as moving the mouse over it.

3) Both the wxPython and wxWidgets mailing lists are probably better places to ask for help on wxPython.

Good luck

> ==========
> class MyThread(threading.Thread):
>    def __init__(self, parent):
>        self.parent = parent
>        threading.Thread.__init__(self)
>    def run(self):
>        print time.time()    # appears on stdout
>        time.sleep(5)
>        print time.time()    # appears on stdout
>        self.parent.Destroy()    # ??? doesn't work if the mouse is
> outside of the application window
> class Alarm(wx.Frame):
>    def __init__(self, title, *args):
>        wx.Frame.__init__(self, None, -1, title, pos=(0, 0),
> size=(800, 600), *args)
>        self.sleepThread = MyThread(self)
>        self.sleepThread.start()
>        self.Bind(wx.EVT_CLOSE, self.on_close)
>    def on_close(self, event):
>        self.Destroy()
> ==========
> To call it:
> class Main(wx.PySimpleApp):
>        def OnInit(self):
>            self.frame = alarm.Alarm("Alarm 0.1")
>            self.SetTopWindow(self.frame)
>            self.SetExitOnFrameDelete(True)
>            self.frame.Show()
>            return True
>    a = Main()
>    a.MainLoop()
> =====
> -- 

More information about the Python-list mailing list