Python中wxPython在原frame1上直接新建frame2时,frame2闪退的问题如何解决?
wxPython 如果在原 frame1 上直接新建一个 frame2,frame2 闪一下就消失,但是如果在新建语句后加一个 app.MainLoop()新建的 frame2 不消失,但是 frame1 无法再对操作做出响应。请问这是怎么回事,困扰了好几天仍然没有找到解决方案,心态很崩溃。请问有没有大神知道其中的原理的,求告知,万分感谢!!!!!!!!
Python中wxPython在原frame1上直接新建frame2时,frame2闪退的问题如何解决?
1 回复
这个问题通常是因为新建的frame2被Python垃圾回收了。在wxPython中,窗口对象需要被持续引用才能保持显示。
核心原因:局部变量frame2在函数执行完毕后被销毁,导致窗口闪退。
解决方案:将frame2作为实例变量或全局变量保存引用。
import wx
class MainFrame(wx.Frame):
def __init__(self):
super().__init__(None, title="主窗口")
# 保存对子窗口的引用
self.sub_frame = None
panel = wx.Panel(self)
btn = wx.Button(panel, label="打开子窗口")
btn.Bind(wx.EVT_BUTTON, self.on_open_subframe)
self.Show()
def on_open_subframe(self, event):
# 避免重复创建
if self.sub_frame is None:
self.sub_frame = SubFrame(self)
self.sub_frame.Show()
else:
self.sub_frame.Raise() # 如果已存在则提到前台
class SubFrame(wx.Frame):
def __init__(self, parent):
super().__init__(parent, title="子窗口", size=(300, 200))
wx.StaticText(self, label="这是子窗口")
if __name__ == "__main__":
app = wx.App()
MainFrame()
app.MainLoop()
关键点:
- 将
self.sub_frame作为主窗口的实例变量保存引用 - 使用
parent参数确保窗口关系正确 - 添加重复创建检查避免内存泄漏
一句话建议:确保窗口对象有持久的引用防止被垃圾回收。

