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
相关产品推荐
相关产品推荐

