我想做一个简单的密码生成器,作为我的第一个Python项目之一。它的CLI版本工作正常,现在我将使用PyQt5构建GUI。现在,我连接到按钮的方法出现了问题。它给我一个错误消息,称为
TypeError:参数1具有意外的类型'NoneType
这是我的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
从def_global导入密码
类Ui_mainWindow(object):
def setupUi(self, mainWindow):
# define the variables
self.letters = "n"
self.digits = "n"
self.punctuation = "n"
mainWindow.setObjectName("mainWindow")
mainWindow.resize(652, 422)
self.centralwidget = QtWidgets.QWidget(mainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_top = QtWidgets.QLabel(self.centralwidget)
self.label_top.setGeometry(QtCore.QRect(10, 20, 161, 16))
self.label_top.setObjectName("label_top")
self.spin_box_num = QtWidgets.QSpinBox(self.centralwidget)
self.spin_box_num.setGeometry(QtCore.QRect(10, 240, 51, 32))
self.spin_box_num.setMinimum(1)
self.spin_box_num.setProperty("value", 10)
self.spin_box_num.setObjectName("spin_box_num")
self.check_letters = QtWidgets.QCheckBox(self.centralwidget)
self.check_letters.setGeometry(QtCore.QRect(10, 100, 111, 22))
self.check_letters.setObjectName("check_letters")
self.check_digits = QtWidgets.QCheckBox(self.centralwidget)
self.check_digits.setGeometry(QtCore.QRect(10, 130, 101, 22))
self.check_digits.setObjectName("check_digits")
self.check_punctuation = QtWidgets.QCheckBox(self.centralwidget)
self.check_punctuation.setGeometry(QtCore.QRect(10, 160, 111, 22))
self.check_punctuation.setObjectName("check_punctuation")
self.label_num_chars = QtWidgets.QLabel(self.centralwidget)
self.label_num_chars.setGeometry(QtCore.QRect(10, 210, 151, 20))
self.label_num_chars.setObjectName("label_num_chars")
self.btn_create = QtWidgets.QPushButton(self.centralwidget)
self.btn_create.setGeometry(QtCore.QRect(550, 360, 88, 34))
self.btn_create.setObjectName("btn_create")
self.label_sel_chars = QtWidgets.QLabel(self.centralwidget)
self.label_sel_chars.setGeometry(QtCore.QRect(10, 60, 311, 18))
self.label_sel_chars.setAcceptDrops(False)
self.label_sel_chars.setObjectName("label_sel_chars")
self.label_password = QtWidgets.QLabel(self.centralwidget)
self.label_password.setGeometry(QtCore.QRect(10, 310, 621, 18))
self.label_password.setText("")
self.label_password.setObjectName("label_password")
mainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(mainWindow)
self.statusbar.setObjectName("statusbar")
mainWindow.setStatusBar(self.statusbar)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
if self.check_letters.isChecked():
self.letters = "y"
if self.check_letters.isChecked():
self.digits = "y"
if self.check_punctuation.isChecked():
self.punctuation = "y"
self.btn_create.clicked.connect(self.create_password(self.spin_box_num.value, self.letters, self.digits, self.punctuation))
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "Password Generator"))
self.label_top.setText(_translate("mainWindow", "Create a new passoword."))
self.check_letters.setText(_translate("mainWindow", "Letters"))
self.check_digits.setText(_translate("mainWindow", "Digits"))
self.check_punctuation.setText(_translate("mainWindow", "Punctuation"))
self.label_num_chars.setText(_translate("mainWindow", "Number of characters:"))
self.btn_create.setText(_translate("mainWindow", "Create"))
self.label_sel_chars.setText(_translate("mainWindow", "Select the characters the password should contain."))
def create_password(self, char_num:int=10, letters:str="n", digits:str="n", punctuation:str="n"):
"""Creates the password"""
password = Password(char_num, letters, digits, punctuation)
print(password)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_mainWindow()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
我尝试运行它时显示以下错误消息:
Traceback (most recent call last):
File "/home/paul/Dev/Python/Projekte/password-generator/neu/main_win.py", line 104, in <module>
ui.setupUi(mainWindow)
File "/home/paul/Dev/Python/Projekte/password-generator/neu/main_win.py", line 77, in setupUi
self.btn_create.clicked.connect(self.create_password(self.spin_box_num.value, self.letters,
self.digits, self.punctuation))
TypeError: argument 1 has unexpected type 'NoneType'
connect
方法期望可调用对象作为参数。在这里,您传递的是返回的create_password
值(即None
)。
使用触发clicked
时将被调用的lambda:
self.btn_create.clicked.connect(lambda _: create_password(self, 10, "n", "n", "n"))