如何以编程方式关闭wx.DirDialog?

2024-05-06

我有 wxpython 应用程序,可以在单击按钮时打开 wx.DirDialog 。

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

由于我的应用程序是多线程的,并且使用 wxTaskbaricon ,它允许用户(在 Win 7 上)即使在模式 DirDialog 打开时也可以关闭应用程序,所以我想在关闭主应用程序之前关闭 DirDialog。不知何故,以下方法不起作用:

dlg.Destroy()
dlg.Close(True)

这是我的测试代码。

我可以测试Destroy(), Close() and EndModal()关于模态和非模态wx.DirDialog()

要关闭模式对话框,我必须使用计时器 - 因为模式对话框阻止访问主窗口。

仅当我这样做时它才无法关闭对话框

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

还有一件事 - 我使用 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式关闭wx.DirDialog? 的相关文章

随机推荐