东海ECS 2023-02-26 10:48 采纳率: 66.7%
浏览 29
已结题

PyQt5,UI与逻辑代码分离出错

我使用PyQt5写一个窗体(GUI)程序,我尝试逻辑代码与UI分离,结果第一次成功了,第二次换了个窗体,出错了。
错误报告:
D:\Program\Python\venv\Scripts\python.exe D:\Program\Python\Python日常编程\LifeReopensForGUI\begin.py 
Traceback (most recent call last):
  File "D:\Program\Python\Python日常编程\LifeReopensForGUI\begin.py", line 15, in <module>
    mainMenuWindow.show()
TypeError: 'QPushButton' object is not callable

进程已结束,退出代码1
逻辑代码如下:
from PyQt5 import QtWidgets, QtGui, QtCore
import MainMenu    # 这是窗体文件
import sys


class MainMenuWindow(QtWidgets.QMainWindow, MainMenu.Ui_MainMenu):
    def __init__(self):
        super(MainMenuWindow, self).__init__()
        self.setupUi(self)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainMenuWindow = MainMenuWindow()
    mainMenuWindow.show()
    sys.exit(app.exec_())

UI文件代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'MainMenu.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtWidgets import QMainWindow


class Ui_MainMenu(object):
    def setupUi(self, MainMenu):
        MainMenu.setObjectName("MainMenu")
        MainMenu.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainMenu)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 801, 271))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap(":/png/resource Files/人生重开.png"))
        self.label.setScaledContents(True)
        self.label.setObjectName("label")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 280, 781, 261))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.work = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.work.setObjectName("work")
        self.verticalLayout.addWidget(self.work)
        self.goToSchool = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.goToSchool.setObjectName("goToSchool")
        self.verticalLayout.addWidget(self.goToSchool)
        self.show = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.show.setObjectName("show")
        self.verticalLayout.addWidget(self.show)
        self.study = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.study.setObjectName("study")
        self.verticalLayout.addWidget(self.study)
        self.openBag = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.openBag.setObjectName("openBag")
        self.verticalLayout.addWidget(self.openBag)
        self.goToStore = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.goToStore.setObjectName("goToStore")
        self.verticalLayout.addWidget(self.goToStore)
        MainMenu.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainMenu)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainMenu.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainMenu)
        self.statusbar.setObjectName("statusbar")
        MainMenu.setStatusBar(self.statusbar)

        self.retranslateUi(MainMenu)
        QtCore.QMetaObject.connectSlotsByName(MainMenu)

    def retranslateUi(self, MainMenu):
        _translate = QtCore.QCoreApplication.translate
        MainMenu.setWindowTitle(_translate("MainMenu", "主界面"))
        self.work.setText(_translate("MainMenu", "工作"))
        self.goToSchool.setText(_translate("MainMenu", "去学校"))
        self.show.setText(_translate("MainMenu", "显示属性"))
        self.study.setText(_translate("MainMenu", "学习"))
        self.openBag.setText(_translate("MainMenu", "打开背包"))
        self.goToStore.setText(_translate("MainMenu", "去商店"))
运行结果:
D:\Program\Python\venv\Scripts\python.exe D:\Program\Python\Python日常编程\LifeReopensForGUI\begin.py 
Traceback (most recent call last):
  File "D:\Program\Python\Python日常编程\LifeReopensForGUI\begin.py", line 15, in <module>
    mainMenuWindow.show()
TypeError: 'QPushButton' object is not callable

进程已结束,退出代码1
我的解答思路和尝试过的方法:

我先在UI文件运行窗体,发现没问题.窗体正常显示.
我把窗体类继承的改为QMainWindow,还是有问题.

  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-02-26 12:03
    关注

    该回答引用ChatGPT

    这个错误提示是因为在 MainMenu.ui 文件中,您为 QPushButton 控件命名为 work、goToSchool 等,这些名称与 MainMenuWindow 类中的方法名称重复了,导致程序出现错误。

    为了解决这个问题,您可以尝试以下方法之一:

    1、修改控件名称
    您可以在 MainMenu.ui 文件中修改控件的名称,以避免与 MainMenuWindow 类中的方法名称重复。例如,您可以将 work 控件的名称修改为 workButton,将 goToSchool 控件的名称修改为 goToSchoolButton,以此类推。

    2、修改方法名称
    您也可以修改 MainMenuWindow 类中的方法名称,以避免与 QPushButton 控件的名称重复。例如,您可以将 work 方法的名称修改为 workButtonClicked,将 goToSchool 方法的名称修改为 goToSchoolButtonClicked,以此类推。

    修改后的代码如下所示:

    
    from PyQt5 import QtWidgets, QtGui, QtCore
    import MainMenu    # 这是窗体文件
    import sys
     
    class MainMenuWindow(QtWidgets.QMainWindow, MainMenu.Ui_MainMenu):
        def __init__(self):
            super(MainMenuWindow, self).__init__()
            self.setupUi(self)
     
            # 将 QPushButton 控件的 clicked 信号连接到对应的方法上
            self.workButton.clicked.connect(self.workButtonClicked)
            self.goToSchoolButton.clicked.connect(self.goToSchoolButtonClicked)
            self.showButton.clicked.connect(self.showButtonClicked)
            self.studyButton.clicked.connect(self.studyButtonClicked)
            self.openBagButton.clicked.connect(self.openBagButtonClicked)
            self.goToStoreButton.clicked.connect(self.goToStoreButtonClicked)
     
        def workButtonClicked(self):
            print("workButtonClicked")
     
        def goToSchoolButtonClicked(self):
            print("goToSchoolButtonClicked")
     
        def showButtonClicked(self):
            print("showButtonClicked")
     
        def studyButtonClicked(self):
            print("studyButtonClicked")
     
        def openBagButtonClicked(self):
            print("openBagButtonClicked")
     
        def goToStoreButtonClicked(self):
            print("goToStoreButtonClicked")
     
     
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        mainMenuWindow = MainMenuWindow()
        mainMenuWindow.show()
        sys.exit(app.exec_())
    
    

    在这个代码中,我们将 QPushButton 控件的名称修改为 workButton、goToSchoolButton 等,并且将这些控件的 clicked 信号连接到对应的方法上,这样就可以避免命名冲突了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月26日
  • 创建了问题 2月26日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装
  • ¥40 复杂的限制性的商函数处理