PyQt5多窗口GUI行为异常:为何输入打印次数随窗口切换累加
根本原因
Qt的信号-槽机制支持同一信号多次绑定同一个槽函数,绑定关系会持续保留,不会被后续的新绑定自动覆盖。
你的代码中,screen2()函数每次被调用(也就是每次点击主界面的打开按钮、进入次界面时),都会执行两行绑定逻辑:
myApp.pushButton_2.clicked.connect(add_name) myApp.pushButton_3.clicked.connect(close_screen2)
每执行一次,就会给对应按钮的clicked信号新增一次和目标槽的绑定,累计效果如下:
- 第1次打开次界面:
pushButton_2共绑定1次add_name,点击Ok时槽执行1次,输出1行 - 第2次打开次界面:
pushButton_2累计绑定2次add_name,点击Ok时槽执行2次,输出2行 - 第3次打开次界面:累计绑定3次,输出3行
和你观察到的输出完全吻合。
修复方案
方案1:仅初始化时绑定一次(推荐)
次界面两个按钮的功能是固定的,不需要每次打开都重复绑定。把绑定代码从screen2()中移出,放到全局初始化阶段,只执行一次即可:
修改后的核心代码:
def screen2(): myApp.frame_1.close() myApp.frame_2.show() def add_name(): name = myApp.lineEdit.text() print(name) def close_screen2(): myApp.lineEdit.setText('') myApp.frame_2.close() myApp.frame_1.show() app = QtWidgets.QApplication.instance() if app is None: app = QtWidgets.QApplication(sys.argv) myApp = uic.loadUi('myApp.ui') myApp.show() myApp.frame_2.close() myApp.pushButton.clicked.connect(screen2) # 新增:仅做一次绑定 myApp.pushButton_2.clicked.connect(add_name) myApp.pushButton_3.clicked.connect(close_screen2) app.exec_()
方案2:绑定前先清除旧绑定
如果业务逻辑需要每次进入次界面都动态更新槽的绑定(比如槽函数的参数、逻辑会随运行状态变化),可以在绑定前先断开该信号下的所有现有绑定:
修改screen2()函数即可:
def screen2(): myApp.frame_1.close() myApp.frame_2.show() # 先清除原有绑定,未绑定时会抛出TypeError,直接捕获 try: myApp.pushButton_2.clicked.disconnect() myApp.pushButton_3.clicked.disconnect() except TypeError: pass # 重新绑定 myApp.pushButton_2.clicked.connect(add_name) myApp.pushButton_3.clicked.connect(close_screen2)
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

