2011-09-08 53 views
5

我創建了一個wxPython應用程序,它在對話框窗口上顯示一些消息。在單擊對話框確定按鈕之前,對話框窗口需要被應用程序強制銷燬。我使用wx.lib.delayedresult來進行破壞調用。如何安全銷燬wxPython應用程序的對話窗口?

我的代碼是:

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

這可以做什麼,我想要做的,而我得到了以下錯誤消息:

(蟒蛇:15150):GTK的CRITICAL **:gtk_widget_destroy :斷言`GTK_IS_WIDGET(widget)'失敗

如何「安全地」銷燬對話框而不點擊對話框按鈕?

回答

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

感謝您的回覆!我已經試過這個,發現對話框不會消失。 – Akira

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/

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)將退出提示,並移動到下一行。