如何安全地销毁wxPython应用程序的对话窗口?

时间:2011-09-08 20:46:18

标签: python wxpython

我创建了一个wxPython应用程序,它在对话框窗口中显示了一些消息。在单击对话框“确定”按钮之前,应用程序需要强制销毁对话框窗口。我使用wx.lib.delayedresult来进行destroy调用。

我的代码是:

import wx
dlg=wx.MessageDialog(somewindow,'somemessage')
from wx.lib.delayedresult import startWorker
def _c(d):
    dlg.EndModal(0)
    dlg.Destroy()
def _w():
    import time
    time.sleep(1.0)
startWorker(_c,_w)
dlg.ShowModal()

当我收到以下错误消息时,这可以做我想做的事情:

  

(python:15150):Gtk-CRITICAL **:gtk_widget_destroy:断言`GTK_IS_WIDGET(widget)'失败

如何在不单击对话框按钮的情况下“安全地”销毁对话框?

3 个答案:

答案 0 :(得分:0)

我使用wxWidgets已经有一段时间了,但我认为你的dlg.Destroy()可能在错误的地方。尝试将其移动到主线程中。

import wx
dlg=wx.MessageDialog(somewindow,'somemessage')
from wx.lib.delayedresult import startWorker
def _c(d):
    dlg.EndModal(0)
def _w():
    import time
    time.sleep(1.0)
startWorker(_c,_w)
dlg.ShowModal()
dlg.Destroy()

答案 1 :(得分:0)

我会使用wx.Timer()

import wx

########################################################################
class MyDialog(wx.Dialog):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Dialog.__init__(self, None, title="Test")

        timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.onTimer, timer)
        timer.Start(5000)

        self.ShowModal()

    #----------------------------------------------------------------------
    def onTimer(self, event):
        """"""
        print "in onTimer"
        self.Destroy()

if __name__ == "__main__":
    app = wx.App(False)
    dlg = MyDialog()
    app.MainLoop()

另见http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

答案 2 :(得分:0)

我对dlg.Destroy()的问题是它没有退出提示。 我已完成以下操作以退出提示:

def OnCloseWindow(self, e):    
    dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question',
                            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
    ret = dial.ShowModal()
    if ret == wx.ID_YES:
        self.Destroy()
        sys.exit(0)

sys.exit(0)将退出提示并移至下一行。