PyQt5点击按钮显示另一控件时子窗口自动消失该如何解决
问题原因
子窗口一闪而过的核心原因是子窗口对象被Python垃圾回收机制销毁。你在register_system方法中创建的opener = SubWindow()是方法内的局部变量,当方法执行完成后,该局部变量的引用计数清零,对应的SubWindow实例会被GC自动回收,绑定的窗口也就随之销毁消失。
修复方案
根据使用场景可以选择以下两种方案之一:
方案1:绑定为主窗口实例属性(适合单次仅打开一个子窗口)
将局部的子窗口变量改为主窗口的属性,让子窗口的生命周期和主窗口绑定,不会被提前回收。
- 首先优化子窗口类,移除内部的
self.show()调用,统一由外部控制显示时机,同时调整标签尺寸避免文字无法显示:
class SubWindow(QWidget): def __init__(self, parent = None): super(SubWindow, self).__init__(parent) label = QLabel("Sub Window", self) label.setGeometry(0, 0, 100, 30)
- 修改
register_system方法:
def register_system(self): self.opener = SubWindow() self.opener.show()
方案2:列表存储子窗口实例(支持同时打开多个子窗口)
如果需要允许用户同时打开多个子窗口,可以在主窗口中维护一个子窗口实例列表,避免实例被回收。
- 主窗口初始化时新增子窗口存储列表:
class pro(QWidget): def __init__(self, parent=None): super(pro, self).__init__(parent) self.sub_windows = [] # 新增行,用于存储子窗口实例 # 后续原有初始化逻辑保持不变
- 修改
register_system方法:
def register_system(self): opener = SubWindow() self.sub_windows.append(opener) opener.show()
如果需要优化内存占用,可以为子窗口绑定关闭事件,子窗口关闭时自动从列表中移除对应实例即可。
内容的提问来源于stack exchange,提问作者I am new
相关产品推荐
相关产品推荐

