You need to enable JavaScript to run this app. PyQt5多窗口GUI行为异常:为何输入打印次数随窗口切换累加
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 19:54:06