How to close wx.DirDialog programatically?
Question: I have wxpython app that open wx.DirDialog on button click.

    
    
    dlg = wx.DirDialog(self, "Choose a directory:", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            # Do some stuff
    

Since my application is multithreaded and uses wxTaskbaricon which allow user
(on Win 7) to close application even when modal DirDialog is open, I want to
close the DirDialog before closing main app. Somehow non of below method work:

    
    
    dlg.Destroy()
    dlg.Close(True)
    


Answer: It is my testing code.

I can test `Destroy()`, `Close()` and `EndModal()` on Modal and Non-Modal
`wx.DirDialog()`

To close modal dialog I had to use Timer - because modal dialog is blocking
access to the main window.

It can't close dialog only if I do

    
    
    self.dlg = None
    self.dlg.EndModal(wx.CANCEL) # or Destroy() or Close(True)
    

And one more thing - I use Linux Mint 15, Python 2.7.4, wxPython 2.8.12.1 :)

* * *
    
    
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    import wx
    import sys # to get python version
    
    #----------------------------------------------------------------------
    
    class MyFrame(wx.Frame):
    
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, title=title, size=(600,100))
    
            self.panel = wx.Panel(self)
    
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.panel.SetSizer(self.sizer)
    
    
            self.label = wx.StaticText(self.panel, label="Python "+sys.version+"\nwxPython"+wx.version())
            self.button1 = wx.Button(self.panel, label="On")
            self.button2 = wx.Button(self.panel, label="Off")
    
            self.sizer.Add(self.label)
            self.sizer.Add(self.button1)
            self.sizer.Add(self.button2)
    
            self.Bind(wx.EVT_BUTTON, self.OpenDialog, self.button1)
            self.Bind(wx.EVT_BUTTON, self.CloseDialog, self.button2)
    
            self.timer = wx.Timer(self)
            self.Bind(wx.EVT_TIMER, self.TimerCloseDialog, self.timer)
    
            self.Show(True)
    
            self.dlg = None
    
        def OpenDialog(self, event):
            print "OpenDialog"
    
            self.timer.Start(3000, oneShot=True)
            print "wait 3s ..."
    
            if not self.dlg:
                self.dlg = wx.DirDialog(self)
                self.dlg.ShowModal()
                #self.dlg.Show(True)
    
        def CloseDialog(self, event):
            print "CloseDialog"
            if self.dlg:
                #self.dlg = None
                #self.dlg.EndModal(wx.CANCEL)
                self.dlg.Destroy()
                #self.dlg.Close(True)
    
        def TimerCloseDialog(self, event):
            print "TimerCloseDialog"
            if self.dlg:
                #self.dlg = None
                self.dlg.EndModal(wx.CANCEL)
                #self.dlg.Destroy()
                #self.dlg.Close(True)
    
    #----------------------------------------------------------------------
    
    print "Python", sys.version
    print "wxPython", wx.version()
    
    app = wx.App()
    frame = MyFrame(None, "Hello Dialog")
    app.MainLoop()
    

