【问题标题】:How do I safely destroy a dialog window of a wxPython application?如何安全地销毁 wxPython 应用程序的对话框窗口?
【发布时间】:2011-11-13 07:59:24
【问题描述】:

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

我的代码是:

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)' 失败

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

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    自从我使用 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()
    

    【讨论】:

    • 感谢您的回复!我已经试过了,发现对话框并没有消失。
    【解决方案2】:

    我会使用 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/

    【讨论】:

      【解决方案3】:

      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) 将退出提示并移至下一行。

      【讨论】:

        猜你喜欢
        • 2013-11-29
        • 2013-01-15
        • 2011-03-07
        • 1970-01-01
        • 2019-04-04
        • 2010-10-31
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多