first argument of unbound method must have type 'QWidget


# -*- coding: utf-8 -*-
import self as self
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QFont
import sys
from PyQt5.Qt import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QAction, QFileDialog, QComboBox, QFontComboBox, \
    QLineEdit, QMessageBox, QVBoxLayout
from PyQt5.QtGui import QFont, QFontDatabase
import os
import shutil
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtWidgets import QApplication, QWidget

class Ui_MainWindow(QWidget):

    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.setGeometry(100, 200, 600, 311)

        self.groupBox = QtWidgets.QGroupBox(MainWindow)
        self.groupBox.setGeometry(QtCore.QRect(0, 0, 600, 311))
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")

        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(100, 10, 400, 100))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.label.setText("欢迎使用植物专家系统")
        self.label.setFont(QFont("微软雅黑 Light", 20, QFont.Bold))
        self.label.setStyleSheet(
            '''QLabel{color:#4d649f}''')

        self.label_1 = QtWidgets.QLabel(self.groupBox)
        self.label_1.setGeometry(QtCore.QRect(100, 100, 400, 100))
        self.label_1.setAlignment(QtCore.Qt.AlignCenter)
        self.label_1.setText("请选择输入模式")
        self.label_1.setFont(QFont("微软雅黑 Light", 15, QFont.Bold))
        self.label_1.setObjectName("label")
        self.label_1.setStyleSheet(
            '''QLabel{color:#4d649f}''')

        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        self.pushButton.setGeometry(QtCore.QRect(90, 230, 180, 50))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.lay1)
        self.pushButton.setFont(QFont("微软雅黑 Light", 15, QFont.Bold))
        self.pushButton.setText("键盘输入")
        self.pushButton.setStyleSheet(
            '''QPushButton{background:#4d649f;border-radius:5px;color: #ffffff}QPushButton:hover{background:#99C0EF;}''')

        self.pushButton_1 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_1.setGeometry(QtCore.QRect(310, 230, 180, 50))
        self.pushButton_1.setObjectName("pushButton_1")
        #self.pushButton_1.clicked.connect(self.lay2)
        self.pushButton_1.setText("选择输入")
        self.pushButton_1.setFont(QFont("微软雅黑 Light", 15, QFont.Bold))
        self.pushButton_1.setStyleSheet(
            '''QPushButton{background:#4d649f;border-radius:5px;color: #ffffff}QPushButton:hover{background:#99C0EF;}''')

    def lay1(self):
        Ui_Form1.show()  # 创建第二个窗口实例
        self.close()

    #def lay2(self):
        #Ui_Form2.show()  # 创建第二个窗口实例
        #self.close()

class Ui_Form1(QMainWindow):

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setGeometry(100, 200, 600, 311)

        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(0, 0, 600, 311))
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")

        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(20, 10, 72, 15))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setGeometry(QtCore.QRect(20, 190, 72, 15))
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.label_2.setStyleSheet(
            '''QLabel{color:#304486}''')

        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setGeometry(QtCore.QRect(20, 90, 72, 20))
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.label_3.setStyleSheet(
            '''QLabel{color:#304486}''')

        self.label_4 = QtWidgets.QLabel(self.groupBox)
        self.label_4.setGeometry(QtCore.QRect(440, 0, 200, 600))
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.label_4.setStyleSheet(
            '''QLabel{background:#4196e1}''')
        self.label_4.setStyleSheet("QLabel{border-image:url(r.jpg)}")  # 这里使用相对路径,也可以使用绝对路径
        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        self.pushButton.setGeometry(QtCore.QRect(465, 40, 110, 40))
        self.pushButton.setObjectName("pushButton")
        # self.pushButton.setFont(QFont('Calibri', 13))

        self.pushButton.setStyleSheet(
            '''QPushButton{background:#4d649f;border-radius:5px;color: #fff}QPushButton:hover{background:#99C0EF;}''')

        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_2.setGeometry(QtCore.QRect(465, 160, 110, 40))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.btn2_click)
        self.pushButton_2.setStyleSheet("background: purple;border-radius: 15px;color: #fff")
        self.pushButton_2.setStyleSheet(
            '''QPushButton{background:#4d649f;border-radius:5px;color: #fff}QPushButton:hover{background:#99C0EF;}''')
        self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_3.setGeometry(QtCore.QRect(465, 220, 110, 40))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_3.clicked.connect(QtCore.QCoreApplication.instance().quit)
        self.pushButton_3.setStyleSheet("background: purple;border-radius: 15px;color: #fff")
        self.pushButton_3.setStyleSheet(
            '''QPushButton{background:#4d649f;border-radius:5px;color: #fff}QPushButton:hover{background:#99C0EF;}''')
        self.pushButton_4 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_4.setGeometry(465, 100, 110, 40)
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_4.clicked.connect(self.btnc_click)
        self.pushButton.setFont(QFont('Calibri', 13))
        self.pushButton_4.setStyleSheet(
            '''QPushButton{background:#4d649f;border-radius:5px;color: #fff}QPushButton:hover{background:#99C0EF;}''')

        self.textEdit = QtWidgets.QTextEdit(self.groupBox)
        self.textEdit.setGeometry(QtCore.QRect(20, 30, 381, 51))
        self.textEdit.setObjectName("textEdit")
        self.textEdit.setFont(QFont('Helvetica', 11))
        self.textEdit.setStyleSheet(
            '''QTextEdit{background:#e5ecfd;border-radius:15px;}QTextEdit:hover{background:#ffffff;border: #800080;}''')

        self.textEdit.setPlaceholderText("输入事实")
        self.textEdit.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox)
        self.textEdit_2.setGeometry(QtCore.QRect(20, 110, 400, 71))
        self.textEdit_2.setObjectName("textEdit_2")
        self.textEdit_2.setReadOnly(True)
        self.textEdit_2.setFont(QFont('Helvetica', 11))
        self.textEdit_2.setStyleSheet("background: transparent;border:none;")

        self.textEdit_3 = QtWidgets.QTextEdit(self.groupBox)
        self.textEdit_3.setGeometry(QtCore.QRect(20, 210, 220, 50))
        self.textEdit_3.setObjectName("textEdit_3")
        self.textEdit_3.setReadOnly(True)
        self.textEdit_3.setFont(QFont('Helvetica', 11))
        self.textEdit_3.setStyleSheet("background: transparent;border:none;")
        # self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        # self.lineEdit.move(20, 210)
        # self.lineEdit.setReadOnly(True)
        self.pushButton.clicked.connect(self.go)

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

        #self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)  # 隐藏边框并在其他边框之上




    def btn2_click(self):

        self.pushButton_2.setText("展示知识库")

    def btnc_click(self):
        self.pushButton_4.setText("修改知识库")

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "植物专家识别系统"))
        #self.label.setText(_translate("Form", "输入事实"))
        self.label.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.label_2.setText(_translate("Form", "推理结果"))
        self.label_2.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.label_3.setText(_translate("Form", "推理过程"))
        self.label_3.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.pushButton.setText(_translate("Form", "进行推理"))
        self.pushButton.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.pushButton_2.setText(_translate("Form", "展示知识库"))
        self.pushButton_2.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.pushButton_3.setText(_translate("Form", "退出程序"))
        self.pushButton_3.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

        self.pushButton_4.setText(_translate("Form", "修改知识库"))
        self.pushButton_4.setFont(QFont("微软雅黑 Light", 10, QFont.Bold))

    # 将知识库做拓扑排序
    def topological(self):
        Q = []
        P = []
        ans = ""  # 排序后的结果
        for line in open('RD.txt'):
            line = line.strip('\n')
            if line == '':
                continue
            line = line.split(' ')
            Q.append(line[line.__len__() - 1])
            del (line[line.__len__() - 1])
            P.append(line)
        # 计算入度
        inn = []
        for i in P:
            sum = 0
            for x in i:
                if Q.count(x) > 0:  # 能找到,那么
                    sum += Q.count(x)
            inn.append(sum)
        while (1):
            x = 0
            if inn.count(-1) == inn.__len__():
                break
            for i in inn:
                if i == 0:
                    str = ' '.join(P[x])
                    ans = ans + str + " " + Q[x] + "\n"  # 写入结果
                    inn[x] = -1
                    # 更新入度
                    y = 0
                    for j in P:
                        if j.count(Q[x]) == 1:
                            inn[y] -= 1
                        y += 1
                x += 1
        print(ans)
        # 将结果写入文件
        fw = open('RD.txt', 'w', buffering=1)
        fw.write(ans)
        fw.flush()
        fw.close()

    # 进行推理
    def go(self, flag=True):
        # 将产生式规则放入规则库中
        # if P then Q
        # 读取产生式文件
        self.Q = []
        self.P = []
        fo = open('RD.txt', 'r', encoding='utf-8')
        for line in fo:
            line = line.strip('\n')
            if line == '':
                continue
            line = line.split(' ')
            self.Q.append(line[line.__len__() - 1])
            del (line[line.__len__() - 1])
            self.P.append(line)
        fo.close()
        print("go按钮按下")
        self.lines = self.textEdit.toPlainText()
        self.lines = self.lines.split('\n')  # 分割成组
        self.DB = set(self.lines)
        print(self.DB)
        self.str = ""
        print(self.str)
        flag = True
        temp = ""
        for x in self.P:  # 对于每条产生式规则
            if ListInSet(x, self.DB):  # 如果所有前提条件都在规则库中
                self.DB.add(self.Q[self.P.index(x)])
                temp = self.Q[self.P.index(x)]
                flag = False  # 至少能推出一个结论
                self.str += "%s --> %s\n" % (x, self.Q[self.P.index(x)])
        if flag:  # 一个结论都推不出
            print("一个结论都推不出")
            for x in self.P:  # 对于每条产生式
                if ListOneInSet(x, self.DB):  # 事实是否满足部分前提
                    flag1 = False  # 默认提问时否认前提
                    for i in x:  # 对于前提中所有元素
                        if i not in self.DB:  # 对于不满足的那部分
                            btn = s.quest("是否" + i)
                            if btn == QtWidgets.QMessageBox.Ok:
                                self.textEdit.setText(self.textEdit.toPlainText() + "\n" + i)  # 确定则增加到textEdit
                                self.DB.add(i)  # 确定则增加到规则库中
                                flag1 = True  # 肯定前提
                    if flag1:  # 如果肯定前提,则重新推导
                        self.go()
                        return
        self.textEdit_2.setPlainText(self.str)
        print("----------------------")
        print(self.str)
        if flag:
            btn = s.alert("啥也推不出来!!!")
        else:
            self.textEdit_3.setText(temp)


# 判断list中至少有一个在集合set中
def ListOneInSet(li, se):
    for i in li:
        if i in se:
            return True
    return False


# 判断list中所有元素是否都在集合set中
def ListInSet(li, se):
    for i in li:
        if i not in se:
            return False
    return True


class SecondWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.setWindowTitle("展示知识库")
        self.setGeometry(725, 200, 300, 300)
        self.textEdit = QtWidgets.QTextEdit(self)
        self.textEdit.setGeometry(8, 2, 284, 286)

    # 警告没有推导结果
    def alert(self, info):
        QtWidgets.QMessageBox.move(self, 200, 200)
        QtWidgets.QMessageBox.information(self, "Information", self.tr(info))

    # 询问补充事实
    def quest(self, info):
        # 如果推理为空,需要询问用户是否要添加已知条件
        QtWidgets.QMessageBox.move(self, 200, 200)
        button = QtWidgets.QMessageBox.question(self, "Question",
                                                self.tr(info), QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel,
                                                QtWidgets.QMessageBox.Cancel)
        return button

    def handle_click(self):

        str = ""
        fo = open('RD.txt', 'r', encoding='utf-8')
        for line in fo:
            line = line.strip('\n')
            if line == '':
                continue
            str = str + line + "\n"
        fo.close()
        self.textEdit.setText(str)
        self.show()

    # def close_click(self):

    # self.close()

    def handle_close(self):

        self.close()


class thirdWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(thirdWindow, self).__init__(parent)
        self.setWindowTitle("修改知识库")
        self.setGeometry(725, 200, 300, 300)
        self.textEdit = QtWidgets.QTextEdit(self)
        self.textEdit.setGeometry(8, 2, 284, 286)

    '''打开文件'''

    def msg(self):
        _translate = QtCore.QCoreApplication.translate
        directory1 = QFileDialog.getOpenFileName(None, "选择文件", "E:\pythonProject\pythonProject20\RD.txt")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = QWidget()
    ui = Ui_MainWindow()
    ui.setupUi(widget)

    widget.setStyleSheet("#MainWindow{background:#c4d2f6}")
    widget.show()
    ui.pushButton.clicked.connect(Ui_Form1.show)
    sys.exit(app.exec_())
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/04926988059616.png "#left")

【以下回答由 GPT 生成】

这个错误是因为在定义Ui_MainWindow类时,没有继承QWidget,导致在创建对象实例时无法满足unbound方法的要求。

要解决这个问题,可以将Ui_MainWindow类的定义改为继承自QWidget,并重新运行代码。

以下是修改后的代码:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QWidget

class Ui_MainWindow(QWidget):
    def setupUi(self, MainWindow):
        # 你的其他代码...

if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

请使用上述修改后的代码运行程序,该错误将会解决。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^