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

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_())

修复说明

  1. 重构类结构:创建EncryptionWindow继承自QMainWindow,将UI类作为内部成员,彻底解决代码嵌套错误。
  2. 修正信号绑定:使用UI生成的正确控件名绑定信号,确保按钮点击事件能触发对应方法。
  3. 统一程序入口:保留唯一的程序入口,初始化正确的窗口类实例。
  4. 完善错误处理:增加密钥格式、文件读写的错误捕获,提升程序稳定性。
  5. 修正控件引用:全程使用UI生成器生成的控件名称,避免属性不存在的问题。

内容的提问来源于stack exchange,提问作者Каштан Гавриил

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:30:59