How to close wx.DirDialog programmatically?

后端 未结 1 1052
自闭症患者
自闭症患者 2021-01-25 17:59

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()          


        
1条回答
  •  一向
    一向 (楼主)
    2021-01-25 18:33

    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()
    

    0 讨论(0)
提交回复
热议问题