gpt4 book ai didi

python - 如何在用户单击框架的关闭时终止 WxPython 应用程序

转载 作者:太空狗 更新时间:2023-10-29 17:04:47 25 4
gpt4 key购买 nike

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

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

通过关闭按钮终止 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()

现在如果你绑定(bind)了 wx.EVT_CLOSE,那么你将陷入无限循环,直到出现段错误。绑定(bind)到 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()

关于python - 如何在用户单击框架的关闭时终止 WxPython 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10833163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com