我创建了一个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)'失败
如何在不单击对话框按钮的情况下“安全地”销毁对话框?
答案 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)
将退出提示并移至下一行。