如何安全地销毁 wxPython 应用程序的对话框窗口?

发布于 2024-12-03 22:23:56 字数 557 浏览 1 评论 0原文

我创建了一个 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(小部件)”失败

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

I created a wxPython application which shows some messages on a dialog window. The dialog window is needed to be force-destroyed by the application before I click the dialog OK button. I used wx.lib.delayedresult to make the destroy call.

My code is:

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

This can do what I desire to do while I got a error message below:

(python:15150): Gtk-CRITICAL **: gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)' failed

How do I "safely" destroy a dialog without clicking the dialog button?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

人生戏 2024-12-10 22:23:56

我已经有一段时间没有使用 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()

It has been a while since I have used wxWidgets but I think your dlg.Destroy() may be in the wrong place. Try moving it into the main thread.

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()
往日情怀 2024-12-10 22:23:56

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

I would use a 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()

See also http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

离笑几人歌 2024-12-10 22:23:56

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

My problem with dlg.Destroy() is that it is not exiting the prompt.
I have done following to exit the prompt:

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) will exit the prompt and move to next line.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文