You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5点击按钮显示另一控件时子窗口自动消失该如何解决

问题原因

子窗口一闪而过的核心原因是子窗口对象被Python垃圾回收机制销毁。你在register_system方法中创建的opener = SubWindow()是方法内的局部变量,当方法执行完成后,该局部变量的引用计数清零,对应的SubWindow实例会被GC自动回收,绑定的窗口也就随之销毁消失。

修复方案

根据使用场景可以选择以下两种方案之一:

方案1:绑定为主窗口实例属性(适合单次仅打开一个子窗口)

将局部的子窗口变量改为主窗口的属性,让子窗口的生命周期和主窗口绑定,不会被提前回收。

  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)
  1. 修改register_system方法:
def register_system(self):
    self.opener = SubWindow()
    self.opener.show()

方案2:列表存储子窗口实例(支持同时打开多个子窗口)

如果需要允许用户同时打开多个子窗口,可以在主窗口中维护一个子窗口实例列表,避免实例被回收。

  1. 主窗口初始化时新增子窗口存储列表:
class pro(QWidget):
    def __init__(self, parent=None):
        super(pro, self).__init__(parent)
        self.sub_windows = [] # 新增行,用于存储子窗口实例
        # 后续原有初始化逻辑保持不变
  1. 修改register_system方法:
def register_system(self):
    opener = SubWindow()
    self.sub_windows.append(opener)
    opener.show()

如果需要优化内存占用,可以为子窗口绑定关闭事件,子窗口关闭时自动从列表中移除对应实例即可。


内容的提问来源于stack exchange,提问作者I am new

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:57:01