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

PyQt6中如何引用另一窗口对象?解决初始化递归调用错误

如何在PyQt6中引用另一个窗口对象?

问题与报错

当前代码中MainWindow和FilterWindow的初始化方法互相实例化对方,引发无限递归调用,报错信息如下:

初始化调用无限递归
文件 "E:\Work\PythonProjects\MyApp\Ui\main.py",第14行,在__init__中
self.fp = FilterWindow()
^^^^^^^^^^^^^^
文件 "E:\Work\PythonProjects\MyApp\Ui\main.py",第454行,在__init__中
self.mn = MainWindow()
^^^^^^^^^^^^

SystemError: D:_w\1\s\Objects\longobject.c:1208: bad argument to internal function

错误根源:创建MainWindow时会初始化FilterWindow,而FilterWindow初始化又会创建新的MainWindow,形成无限循环的调用链,最终触发系统错误。

解决方案

方案1:传递窗口引用(直接交互场景)

修改两个窗口类的初始化逻辑,将主窗口实例作为参数传递给子窗口,避免循环实例化:

from PySide6.QtWidgets import QApplication, QMainWindow, QWidget
from main_window import Ui_MainWindow
from filter_page import Ui_FilterForm
import sys

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.filter_page_enabled = 1
        self.button_open_filter_page.clicked.connect(self.open_filter_page)
        # 初始化FilterWindow时传入当前主窗口实例
        self.fw = FilterWindow(self)

    def open_filter_page(self):
        self.hide()
        self.fw.show()


class FilterWindow(QWidget, Ui_FilterForm):
    def __init__(self, main_window):
        super().__init__()
        self.setupUi(self)
        # 保存外部传入的主窗口引用,不再自行创建新实例
        self.mw = main_window
        self.button_close_filter_page.clicked.connect(self.change_filter_page_enabled)

    def change_filter_page_enabled(self):
        self.mw.filter_page_enabled = 0
        self.close()
        self.mw.show()


if __name__ == '__main__':
   app = QApplication(sys.argv)
   window = MainWindow()
   window.show()
   app.exec()

关键修改点:

  • FilterWindow的__init__新增main_window参数,接收外部传入的主窗口实例
  • MainWindow初始化时将自身self作为参数传递给FilterWindow,完成引用传递

方案2:使用信号槽解耦(推荐解耦场景)

如果窗口间不需要直接操作对方属性,可通过Qt的信号槽机制实现交互,彻底解除两个窗口类的耦合:

from PySide6.QtWidgets import QApplication, QMainWindow, QWidget
from PySide6.QtCore import Signal
from main_window import Ui_MainWindow
from filter_page import Ui_FilterForm
import sys

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.filter_page_enabled = 1
        self.button_open_filter_page.clicked.connect(self.open_filter_page)
        self.fw = FilterWindow()
        # 连接FilterWindow的自定义信号到主窗口的处理方法
        self.fw.close_signal.connect(self.on_filter_closed)

    def open_filter_page(self):
        self.hide()
        self.fw.show()

    def on_filter_closed(self):
        self.filter_page_enabled = 0
        self.show()


class FilterWindow(QWidget, Ui_FilterForm):
    # 定义自定义信号,关闭窗口时触发
    close_signal = Signal()

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.button_close_filter_page.clicked.connect(self.change_filter_page_enabled)

    def change_filter_page_enabled(self):
        # 发出信号,通知主窗口处理后续逻辑
        self.close_signal.emit()
        self.close()


if __name__ == '__main__':
   app = QApplication(sys.argv)
   window = MainWindow()
   window.show()
   app.exec()

关键修改点:

  • FilterWindow定义close_signal自定义信号,关闭时发出该信号
  • MainWindow连接该信号到自身的on_filter_closed方法,处理窗口切换逻辑
  • 两个窗口类不再直接持有对方实例,实现了解耦

内容的提问来源于stack exchange,提问作者Aleksei Kolchin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:09:55