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

PyQt6与Qt Designer打开第二窗口后按钮失效问题求解

问题原因

你第二页按钮点击无响应是三个低级错误叠加导致的:

  • 你全程只创建了MyApp这一个窗口实例,从来没有实例化过自己写的WhiteHead、YellowFeet类。点击第一页按钮时,你只是在同一个MyApp窗口对象上覆盖加载了WhiteHead.ui的界面内容,根本没有执行WhiteHead类里的__init__代码,自然不会给新界面上的黑脚、粉脚、黄脚按钮绑定点击事件,点了当然没反应,连print都不会触发。
  • 你代码里所有self.show都漏了括号,本质只是引用了show方法,根本没有执行调用,正确写法是self.show(),不过这个不是按钮失效的核心原因,因为加载新UI时窗口本来就处于显示状态。
  • 你写的WhiteHead类初始化里super().__init__也漏了括号,而且整个初始化逻辑里没有调用uic.loadUi()加载WhiteHead.ui文件,就算你真的实例化这个类,运行时也会直接报找不到BlackFeetButton控件的错误。
修复方法

给你两种适配你现有逻辑的改法,第一种改动最小:

方案1:单窗口动态切页(贴合你最初的设计思路)

不用单独给每个页面写类,统一在MyApp类里处理UI加载和按钮绑定,每次加载完新页面的UI之后,立刻给当前页的按钮绑定跳转事件即可,改完的完整代码如下:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6 import uic

class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.load_page("SeagullPage1")
        self.setWindowTitle("SEAGULL IDENTIFIER")

    def load_page(self, page_name):
        # 加载指定UI文件
        uic.loadUi(f"{page_name}.ui", self)
        # 根据当前加载的页面绑定对应按钮事件
        if page_name == "SeagullPage1":
            self.bBlackHead.clicked.connect(lambda: self.openNewPage(self.bBlackHead))
            self.bWhiteHead.clicked.connect(lambda: self.openNewPage(self.bWhiteHead))
        elif page_name == "WhiteHead":
            self.setWindowTitle("SEAGULL IDENTIFIER2")
            self.BlackFeetButton.clicked.connect(lambda: self.openNewPage(self.BlackFeetButton))
            self.PinkFeetButton.clicked.connect(lambda: self.openNewPage(self.PinkFeetButton))
            self.YellowFeetButton.clicked.connect(lambda: self.openNewPage(self.YellowFeetButton))
        elif page_name == "YellowFeet":
            self.setWindowTitle("SEAGULL IDENTIFIER3")
            self.RedBeakButton.clicked.connect(lambda: self.openNewPage(self.RedBeakButton))
            self.NonReadBeakButton.clicked.connect(lambda: self.openNewPage(self.NonReadBeakButton))

    def openNewPage(self, b):
        target_page = b.text()
        self.load_page(target_page)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myApp = MyApp()
    myApp.show()
    sys.exit(app.exec())

方案2:多页面类独立实现

如果你想每个页面单独写成独立的类,要注意两点:一是每个类的初始化方法里必须先加载自己对应的UI文件,再绑定按钮事件;二是跳转时要实例化目标页面的类,不能在原窗口上直接覆盖加载别的UI。
比如WhiteHead类的正确写法:

class WhiteHead(QMainWindow):
    def __init__(self):
        # 调用父类初始化必须加括号
        super().__init__()
        # 先加载当前页的UI,才能找到页面上的按钮控件
        uic.loadUi("WhiteHead.ui", self)
        self.setWindowTitle("SEAGULL IDENTIFIER2") 
        # 再绑定按钮事件
        self.BlackFeetButton.clicked.connect(lambda: self.openNewPage(self.BlackFeetButton))
        self.PinkFeetButton.clicked.connect(lambda: self.openNewPage(self.PinkFeetButton))
        self.YellowFeetButton.clicked.connect(lambda: self.openNewPage(self.YellowFeetButton))   

    def openNewPage(self,b):
        print("hey")
        page_map = {"YellowFeet": YellowFeet}
        target_page = page_map[b.text()]()
        target_page.show()
        self.close()

首页的跳转逻辑也要对应改成实例化目标页:

def openNewPage(self,b):
    page_map = {
        "WhiteHead": WhiteHead,
        "BlackHead": BlackHead # 自行补全对应页面类即可
    }
    target_page = page_map[b.text()]()
    target_page.show()
    self.close()

内容的提问来源于stack exchange,提问作者Frish Coco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:34