2011-09-08 3 views
5

대화 상자 창에 몇 가지 메시지를 표시하는 wxPython 응용 프로그램을 만들었습니다. 대화 상자 창은 대화 상자의 확인 버튼을 클릭하기 전에 응용 프로그램에서 강제로 제거해야합니다. Wx.lib.delayedresult를 사용하여 destroy 호출을 수행했습니다.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 (위젯) '이 실패했습니다.

어떻게 대화 버튼을 클릭하지 않고 대화 상자를 "안전하게"파괴합니까?

답변

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

내가

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

dlg.Destroy()으로도 http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

0

내 문제 참조하십시오 wx.Timer()를 사용합니다는 프롬프트를 종료되지 않는 것입니다. 가 나는 프롬프트를 종료하려면 다음을 수행 한 :

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) 프롬프트를 종료하고 다음 행으로 이동합니다.

관련 문제