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

PyQt中AttributeError: 'NoneType' object has no attribute 'clicked'错误求助

PyQt5 界面切换报错:AttributeError: 'NoneType' object has no attribute 'clicked'

问题代码

def open_beranda(self):
    uic.loadUi("gudangku_main-menu.ui", self)
def open_list(self):
    uic.loadUi("gudangku_list-item.ui", self)

class main_app(QMainWindow):
    def __init__(self):
        super(main_app, self).__init__()
        uic.loadUi("gudangku_main-menu.ui", self)
        self.beranda = self.findChild(QPushButton, "pushButton_4")
        self.list_item = self.findChild(QPushButton, "pushButton_3")

        self.beranda.clicked.connect(self.open_beranda)
        self.list_item.clicked.connect(self.open_list)
        self.show()

app = QApplication(sys.argv)
UIWindow = main_app()
app.exec_()

错误信息

Traceback (most recent call last):
  File "C:\Users\ASUS\pyqt5\gudangmainmenu.py", line 27, in <module>
    UIWindow = main_app()
  File "C:\Users\ASUS\pyqt5\gudangmainmenu.py", line 21, in __init__
    self.beranda.clicked.connect(self.open_beranda)
AttributeError: 'NoneType' object has no attribute 'clicked'

问题原因及解决办法

这个错误的核心是self.findChild()返回了None,说明程序找不到指定的按钮控件,可能由以下几种原因导致:

1. UI文件中控件的对象名不匹配

打开Qt Designer,加载gudangku_main-menu.ui,找到对应的按钮,检查右侧属性面板里的objectName是否确实是pushButton_4和pushButton_3。注意对象名区分大小写,拼写必须完全一致。

2. UI文件路径错误

如果UI文件不在Python脚本的同一目录下,uic.loadUi()会加载失败,导致控件无法被找到。可以使用绝对路径加载:

uic.loadUi(r"C:\Users\ASUS\pyqt5\gudangku_main-menu.ui", self)

或者确认UI文件和脚本在同一文件夹内。

3. 控件类型不匹配

如果按钮不是QPushButton类型(比如是QToolButton),findChild(QPushButton, "...")会返回None。可以先不指定类型,打印控件类型确认:

from PyQt5.QtCore import QObject

self.beranda = self.findChild(QObject, "pushButton_4")
print(type(self.beranda))  # 输出控件实际类型,确认是否为QPushButton

更规范的界面切换方案

你当前的切换方式会每次覆盖窗口控件,后续切换可能出现控件丢失问题。推荐使用QStackedWidget管理多个页面,更稳定:

from PyQt5.QtWidgets import QMainWindow, QApplication, QStackedWidget
from PyQt5 import uic
import sys

class main_app(QMainWindow):
    def __init__(self):
        super(main_app, self).__init__()
        # 创建堆叠控件作为主窗口中心部件
        self.stacked_widget = QStackedWidget(self)
        self.setCentralWidget(self.stacked_widget)

        # 加载两个页面
        self.page_beranda = uic.loadUi("gudangku_main-menu.ui")
        self.page_list = uic.loadUi("gudangku_list-item.ui")

        # 将页面添加到堆叠控件
        self.stacked_widget.addWidget(self.page_beranda)
        self.stacked_widget.addWidget(self.page_list)

        # 绑定按钮切换页面的事件
        self.page_beranda.pushButton_4.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(0))
        self.page_beranda.pushButton_3.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(1))

        self.show()

app = QApplication(sys.argv)
UIWindow = main_app()
app.exec_()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:01:50