PyQt5程序遇TypeError:QLineEdit参数类型错误,求无法运行原因
PyQt5加密程序运行报错的原因分析与修复
问题描述
运行PyQt5加密程序时抛出错误:
TypeError: arguments did not match any overloaded call: QLineEdit(parent: QWidget = None): argument 1 has unexpected type 'Ui_EncryptionbyPyQt5'
核心错误原因
- 代码嵌套逻辑混乱:你在
Ui_EncryptionbyPyQt5类的retranslateUi方法内部嵌套了__init__方法和控件初始化代码,导致self指向的是Ui_EncryptionbyPyQt5实例(而非QWidget子类),执行self.lineedit = QLineEdit(self)时,将非QWidget类型的实例传给了QLineEdit的parent参数,触发类型错误。 - 重复且无效的程序入口:文件末尾存在两个
if __name__ == "__main__"块,第二个入口中的MyWindow是空类,完全无法初始化界面。 - 方法定义位置错误:
openFileNameDialog和ciphering方法定义在类外部,无法正确访问类内控件实例,且绑定信号时使用的self.button在原UI中不存在(实际是self.pushButton)。 - 控件名称不匹配:原UI生成的控件名为
lineEdit、lineEdit_2、lineEdit_3、pushButton、comboBox,但自定义代码中使用了lineedit、lineedit2、combo等错误名称,会导致属性不存在的问题。
修复后的完整代码
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QFileDialog, QMessageBox, QApplication, QLineEdit from datetime import datetime import sys class Ui_EncryptionbyPyQt5(object): def setupUi(self, EncryptionbyPyQt5): EncryptionbyPyQt5.setObjectName("EncryptionbyPyQt5") EncryptionbyPyQt5.setEnabled(True) EncryptionbyPyQt5.resize(800, 608) EncryptionbyPyQt5.setStyleSheet("background-color:#22222e") self.centralwidget = QtWidgets.QWidget(EncryptionbyPyQt5) self.centralwidget.setObjectName("centralwidget") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(220, 80, 301, 61)) self.lineEdit.setStyleSheet("background-color: #22222e;\n" "border: 2px solid #6B8E23;\n" "border-radius: 30;\n" "color: white") self.lineEdit.setObjectName("lineEdit") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(550, 80, 151, 61)) self.pushButton.setStyleSheet("QPushButton {\n" " color: white;\n" " background-color:#6B8E23;\n" " border-radius: 30; \n" "}\n" "\n" "QPushButton:pressed {\n" "background-color: #90EE90\n" "}") self.pushButton.setObjectName("pushButton") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(220, 210, 311, 31)) self.comboBox.setStyleSheet("background-color: #22222e;\n" "border: 2px solid #6B8E23;\n" "border-radius: 30;\n" "color: white") self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(220, 300, 301, 61)) self.lineEdit_2.setStyleSheet("background-color: #22222e;\n" "border: 2px solid #6B8E23;\n" "border-radius: 30;\n" "color: white") self.lineEdit_2.setObjectName("lineEdit_2") self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_3.setGeometry(QtCore.QRect(220, 420, 311, 61)) self.lineEdit_3.setStyleSheet("background-color: #22222e;\n" "border: 2px solid #6B8E23;\n" "border-radius: 30;\n" "color: white") self.lineEdit_3.setObjectName("lineEdit_3") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(300, 500, 151, 61)) self.pushButton_2.setStyleSheet("QPushButton {\n" " color: white;\n" " background-color:#6B8E23;\n" " border-radius: 30; \n" "}\n" "\n" "QPushButton:pressed {\n" "background-color: #90EE90\n" "}") self.pushButton_2.setObjectName("pushButton_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(270, 50, 261, 20)) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_3.setFont(font) self.label_3.setStyleSheet("QLabel {\n" " color: white;\n" " border-radius: 30;\n" "\n" "}") self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(240, 180, 261, 20)) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_4.setFont(font) self.label_4.setStyleSheet("QLabel {\n" " color: white;\n" " border-radius: 30;\n" "\n" "}") self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(230, 270, 261, 20)) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_5.setFont(font) self.label_5.setStyleSheet("QLabel {\n" " color: white;\n" " border-radius: 30;\n" "\n" "}") self.label_5.setObjectName("label_5") self.label_6 = QtWidgets.QLabel(self.centralwidget) self.label_6.setGeometry(QtCore.QRect(250, 390, 261, 20)) font = QtGui.QFont() font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_6.setFont(font) self.label_6.setStyleSheet("QLabel {\n" " color: white;\n" " border-radius: 30;\n" "\n" "}") self.label_6.setObjectName("label_6") EncryptionbyPyQt5.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(EncryptionbyPyQt5) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) self.menubar.setObjectName("menubar") EncryptionbyPyQt5.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(EncryptionbyPyQt5) self.statusbar.setObjectName("statusbar") EncryptionbyPyQt5.setStatusBar(self.statusbar) self.retranslateUi(EncryptionbyPyQt5) QtCore.QMetaObject.connectSlotsByName(EncryptionbyPyQt5) def retranslateUi(self, EncryptionbyPyQt5): _translate = QtCore.QCoreApplication.translate EncryptionbyPyQt5.setWindowTitle(_translate("EncryptionbyPyQt5", "MainWindow")) self.pushButton.setText(_translate("EncryptionbyPyQt5", "Выбрать файл")) self.comboBox.setItemText(0, _translate("EncryptionbyPyQt5", "Зашифровать")) self.comboBox.setItemText(1, _translate("EncryptionbyPyQt5", "Расшифровать")) self.lineEdit_3.setText(_translate("EncryptionbyPyQt5", "ваывавы")) self.pushButton_2.setText(_translate("EncryptionbyPyQt5", "Запустить")) self.label_3.setText(_translate("EncryptionbyPyQt5", "Введите имя файла")) self.label_4.setText(_translate("EncryptionbyPyQt5", " Выберите тип")) self.label_5.setText(_translate("EncryptionbyPyQt5", " Введите ключ от 1 до 90")) self.label_6.setText(_translate("EncryptionbyPyQt5", " Куда вывести")) class EncryptionWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_EncryptionbyPyQt5() self.ui.setupUi(self) # 绑定按钮信号 self.ui.pushButton.clicked.connect(self.openFileNameDialog) self.ui.pushButton_2.clicked.connect(self.ciphering) def openFileNameDialog(self): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName(self, "Select Text file", "", "Text Files (*.txt)", options=options) if fileName: self.ui.lineEdit.setText(fileName) def ciphering(self): filename = self.ui.lineEdit.text() optfilename = self.ui.lineEdit_3.text() process = self.ui.comboBox.currentText() key = self.ui.lineEdit_2.text() # 验证密钥格式与范围 if not key.isdigit(): QMessageBox.critical(self, "密钥错误", "请输入1-90之间的数字密钥") return password_key = int(key) if password_key < 1 or password_key >90: QMessageBox.critical(self, "密钥范围错误", "请输入1-90之间的数字密钥") return # 验证文件名输入 if not filename or not optfilename: QMessageBox.critical(self, "输入错误", "请填写完整的文件名和输出文件名") return store = '' Letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz' \ '!@#$%&*(){}[]<>/|";;:\n-=+.,?0123456789' now = datetime.now() print(now) if process == 'Зашифровать': print(f'已选择: {process}') if filename.endswith('.txt'): try: with open(filename, 'r', encoding='utf-8') as f: file_content = f.read() except Exception as e: QMessageBox.critical(self, "文件读取错误", f"无法读取文件: {str(e)}") return for i in file_content: if i in Letters: number = Letters.find(i) number += password_key if number >= len(Letters): number -= len(Letters) store += Letters[number] else: store += i try: with open(f'{optfilename}.txt', 'w', encoding='utf-8') as f: f.write(store) QMessageBox.about(self, "处理完成", f"恭喜!{process}已成功完成。") except Exception as e: QMessageBox.critical(self, "文件保存错误", f"无法保存文件: {str(e)}") else: QMessageBox.critical(self, "文件类型错误", "请选择txt格式的文件") elif process == 'Расшифровать': print(f'已选择: {process}') if filename.endswith('.txt'): try: with open(filename, 'r', encoding='utf-8') as f: file_content = f.read() except Exception as e: QMessageBox.critical(self, "文件读取错误", f"无法读取文件: {str(e)}") return for i in file_content: if i in Letters: number = Letters.find(i) number -= password_key if number < 0: number += len(Letters) store += Letters[number] else: store += i try: with open(f'{optfilename}.txt', 'w', encoding='utf-8') as f: f.write(store) QMessageBox.about(self, "处理完成", f"恭喜!{process}已成功完成。") except Exception as e: QMessageBox.critical(self, "文件保存错误", f"无法保存文件: {str(e)}") else: QMessageBox.critical(self, "文件类型错误", "请选择txt格式的文件") if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = EncryptionWindow() window.show() sys.exit(app.exec_())
修复说明
- 重构类结构:创建
EncryptionWindow继承自QMainWindow,将UI类作为内部成员,彻底解决代码嵌套错误。 - 修正信号绑定:使用UI生成的正确控件名绑定信号,确保按钮点击事件能触发对应方法。
- 统一程序入口:保留唯一的程序入口,初始化正确的窗口类实例。
- 完善错误处理:增加密钥格式、文件读写的错误捕获,提升程序稳定性。
- 修正控件引用:全程使用UI生成器生成的控件名称,避免属性不存在的问题。
内容的提问来源于stack exchange,提问作者Каштан Гавриил
相关产品推荐
相关产品推荐

