2011-09-08 7 views
5

私はダイアログウィンドウにいくつかのメッセージを表示するwxPythonアプリケーションを作成しました。ダイアログボックスのOKボタンをクリックする前に、ダイアログウィンドウがアプリケーションによって強制破壊される必要があります。 wx.lib.delayedresultを使用して破壊呼び出しを行いました。wxPythonアプリケーションのダイアログウィンドウを安全に破壊するにはどうすればいいですか?

私のコードは次のとおりです。

(パイソン:15150):のGtk-CRITICAL **:gtk_widget_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() 

:アサーション `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)はプロンプトを終了し、次の行に移動します。

関連する問題