当前位置: 首页 > 面试题库 >

用户单击框架的关闭位置时如何杀死WxPython应用程序

燕扬
2023-03-14
问题内容

单击主框架的关闭按钮时,应关闭该应用程序。但是我实现它的方式是,Segmentation fault当我单击按钮时,它以a退出。

我担心程序会安全关闭,因为稍后我需要将内容持久保存到磁盘。

通过关闭按钮终止WxPython应用程序的 正确的非暴力方式 是什么?

这是我实现的程序的“主”循环:

if __name__ == "__main__":
    app = wx.App(False)
    mf = MainFrame(None, title="Spectrum Checker") #subclasses frame
    mf.register_close_callback( app.Destroy) #what is the apt func?
    app.MainLoop()

这是在中实现回调的方法MainFrame

def __init__(self, parent, title):
    ...
    self.Bind(wx.EVT_CLOSE, self._when_closed)

...

def _when_closed(self, event):
if self.__close_callback__:
    self.__close_callback__()

问题答案:

这是关闭框架的常规方法:

import wx

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Close Me")
        panel = wx.Panel(self)

        closeBtn = wx.Button(panel, label="Close")
        closeBtn.Bind(wx.EVT_BUTTON, self.onClose)

    #----------------------------------------------------------------------
    def onClose(self, event):
        """"""
        self.Close()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

现在,如果您具有对wx.EVT_CLOSE的绑定,那么您将陷入无限循环,直到遇到段错误。绑定到EVT_CLOSE的主要原因是,您可以捕获关闭事件并要求用户保存其信息。如果要这样做,则需要使用self.Destroy而不是“
self.Close”,这样就不必继续触发该事件。

如前所述,在关闭处理程序中,您需要确保结束线程,销毁任务栏图标,关闭打开的文件等,以便不会挂起任何东西。另请参阅:http : //wxpython.org/docs/api/wx.CloseEvent-
class.html

OP的添加

我面临两个问题,感谢 所有三个 答案帮助我找到了它们:

首先,框架不响应self.Close()self.Destroy()因为它具有一个self.stuff具有正在运行的线程的属性。该线程必须先关闭。

其次,self.Close()在响应关闭事件并在调用时引起无限递归的处理程序中。这会导致运行时错误(分段错误,递归深度超出)。解决方法是self.Destroy()改用。



 类似资料:
  • 我正在使用可点击的下拉菜单进行导航。下拉列表使用输入标记。我陷入困境的地方是,如果访问者单击页面上的其他地方,我需要关闭下拉列表。我正在尝试使用目标属性、matches()方法和onclick事件。 我在控制台中注意到的是,当我打开下拉列表时,两个条件语句都出现了,下拉列表没有打开。这就好像下拉列表同时打开和关闭。 我做错了什么?我如何让它正常工作,以便用户只需打开下拉菜单,并在单击网页上的其他位

  • 在一个PC游戏中,我有ingame浏览器用于新闻、虚拟货币商店和社交网络。它是由Chromium嵌入式框架的全新更新构建的。问题是当我打开一个浏览器窗口(网站在那里工作良好),然后关闭,对于某些网站CEF子进程没有完成。我也可能继续听音频,如果是Youtube视频,例如。我使用的是屏幕外呈现,其他原生窗口不创建,只创建子进程。要关闭浏览器窗口,我删除对CefBrowser的所有引用并调用: 我还尝

  • 问题内容: 我有一个Python应用程序,该应用程序打开一个简单的TCP套接字以与单独主机上的另一个Python应用程序进行通信。有时程序会出错,或者我将直接杀死它,并且无论哪种情况,套接字都可能在未知的时间内保持打开状态。 下次我运行程序时,出现此错误: 现在,程序始终尝试使用相同的端口,因此看起来好像它仍处于打开状态。我检查了一下,很确定程序没有在后台运行,但是我的地址仍在使用中。 因此,如何

  • 问题内容: 基本上我想 从主应用程序上的按钮进行调用。我用这个 当 我出现并关闭它时,/ 也关闭。我尝试添加,但也无法正常工作。如何获得? 任何帮助,将不胜感激。 问题答案: 改变如下。 如果添加false,则close属性的默认出口变为false。

  • 我正在学习如何使用parse创建聊天客户端的教程。链接:https://github.com/codepath/android_guides/wiki/Building-Simple-Chat-Client-with-Parse当我在应用程序中按下发送时,它会说“parseapp”已经停止。我是一名新程序员,不确定为什么它不起作用。我的代码中没有错误。尽管这一定与按下按钮的时间有关,或者有一些变量

  • 问题内容: 在生产环境中运行Express应用程序时,我想在服务器进程被杀死(即,发送SIGTERM或SIGINT)时正常关闭服务器。 这是我的代码的简化版本: 当我运行它并在浏览器中调用URL http:// localhost:3000 / 时,setInterval函数中的log语句将一直打印“当前打开1个连接”,直到我真正关闭浏览器窗口为止。显然,即使关闭选项卡也会使连接保持打开状态。 因