#python #user-interface #pyqt5
Вопрос:
Я начал создавать своего рода LMS, цель которого состоит в том, чтобы пользователь вводил учетные записи в порядке, подлежащем оценке в этих записях (это логическая функция, если запись правильная, пользователь получает 1 балл, или запись неправильная). Поэтому я выбрал библиотеку PyQt5 для создания страницы меню приветствия, где пользователь может зарегистрироваться (данные хранятся в таблице SQLite) и пройти аутентификацию (запрашиваются те же данные, записанные во время аутентификации), пока не возникнет никаких проблем.
Затем я создал класс и атрибут, относящиеся к «экрану упражнений» (используя QtDesigner), то есть к окну, являющемуся предметом упражнения.
Я блокирую отображение этого экрана («экран упражнений») после успешной аутентификации. Я хотел бы, чтобы после того, как имя пользователя и пароль введены правильно, отображался, без создания дополнительного окна, экран, относящийся к упражнению.
В начале у меня было сообщение об ошибке, в котором говорилось, что у меня нет атрибута в классе login, но теперь я написал дополнительный код, у меня больше нет этой конкретной ошибки.
Я помещаю вам приведенный ниже код и скриншоты экранов, которые вызываются во время выполнения программы:
import sys
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QWidget
import sqlite3
class WelcomeScreen(QDialog):
def __init__(self):
super(WelcomeScreen, self).__init__()
loadUi("welcomescreen.ui", self)
self.login.clicked.connect(self.gotologin)
self.create.clicked.connect(self.gotocreate)
def gotologin(self):
login = LoginScreen()
widget.addWidget(login)
widget.setCurrentIndex(widget.currentIndex() 1)
def gotocreate(self):
create = CreateAccScreen()
widget.addWidget(create)
widget.setCurrentIndex(widget.currentIndex() 1)
class LoginScreen(QDialog):
def __init__(self):
super(LoginScreen, self).__init__()
loadUi("login.ui", self)
self.passwordfield.setEchoMode(QtWidgets.QLineEdit.Password)
self.login.clicked.connect(self.loginfunction)
def loginfunction(self):
user = self.usernamefield.text()
password = self.passwordfield.text()
bookkeeping = BookKeepingScreen()
def gotobookkeeping(self):
BookKeepingScreen = BookKeepingScreen()
widget.addWidget(BookKeepingScreen)
widget.setCurrentIndex(widget.currentIndex() 1)
if len(user)==0 or len(password)==0:
self.error.setText("Veuillez remplir tous les champs")
else :
conn = sqlite3.connect("logindata.db")
cur = conn.cursor()
query = 'SELECT password FROM login_info WHERE username ='' user "'"
cur.execute(query)
result_pass = cur.fetchone()[0]
if result_pass == password:
print("Authentification réussie !")
self.error.setText("")
self.bookkeeping.connect(self.gotobookkeeping)
else :
self.error.setText("nom d'utilisateur ou mot de passe invalide...")
class BookKeepingScreen(QDialog):
def __init__(self):
super(BookKeepingScreen, self).__init__()
loadUi("bookkeeping.ui", self)
def BookKeepingfunction(self):
def loginfunction(self):
compte = self.case_compte_1.text()
libelle = self.case_libelle_1.text()
debit = self.case_debit_1.text()
credit = self.case_credit_1.text()
if len(compte)==401:
self.error.setText("Ce n'est pas le bon compte")
else :
conn = sqlite3.connect("logindata.db")
cur = conn.cursor()
query = 'SELECT libelle FROM pcg WHERE compte = "401"'
cur.execute(query)
result_validation = cur.fetchone()[0]
if result_validation == compte:
print(" 1")
conn = sqlite3.connect("logindata.db")
cur = conn.cursor()
user_info = [user, info, level]
cur.execute('INSERT INTO login_info (username, password, level) VALUES ( 1)', user_info)
conn.commit()
conn.close()
class CreateAccScreen(QDialog):
def __init__(self):
super(CreateAccScreen, self).__init__()
loadUi("createacc.ui", self)
self.passwordfield.setEchoMode(QtWidgets.QLineEdit.Password)
self.confirmpasswordfield.setEchoMode(QtWidgets.QLineEdit.Password)
self.senregistrerButton.clicked.connect(self.senregistrerButtonfunction)
def senregistrerButtonfunction(self):
user = self.usernamefield.text()
password = self.passwordfield.text()
confirmpassword = self.confirmpasswordfield.text()
if len(user)==0 or len(password)==0 or len(confirmpassword)==0:
self.error.setText("Veuillez remplir tous les champs")
elif password!=confirmpassword:
self.error.setText("Les mots de passes ne correspondent pas")
else :
conn = sqlite3.connect("logindata.db")
cur = conn.cursor()
user_info = [user, password]
cur.execute('INSERT INTO login_info (username, password) VALUES (?,?)', user_info)
conn.commit()
conn.close()
app = QApplication(sys.argv)
welcome = WelcomeScreen()
widget = QtWidgets.QStackedWidget()
widget.addWidget(welcome)
widget.setFixedHeight(800)
widget.setFixedHeight(1200)
widget.show()
try:
sys.exit(app.exec_())
except:
print("Exiting")
Комментарии:
1. Ваш вопрос и код как-то сбивают с толку, поэтому вам немного сложно по-настоящему помочь, так как есть много проблем, некоторые логические, другие практические, и предоставленного вами кода также недостаточно для его запуска (в нем отсутствуют файлы пользовательского интерфейса). Например,
gotobookkeeping
функция никогда не вызывается, и даже если бы это было так, это привело бы к сбою вашей программы, поскольку она использует неопределенные переменные и атрибуты (user
,password
,self.bookkeeping
); кроме того,loginfunction
она абсолютно ничего не делает, поскольку создает локальные переменные, которые немедленно уничтожаются, как только функция возвращается.2. Имейте в виду, что ясно, что вы следуете руководству, которое известно тем, что предоставляет ужасные предложения и обучает множеству плохих практик. Только несколько примеров: 1. вы не должны добавлять QDialogs в QStackedWidget (попробуйте нажать клавишу Esc, и вы увидите); 2. виджет с накоплением предназначен для циклического просмотра существующих виджетов (так же, как виджет с вкладками, без вкладок), а не для их непрерывного добавления; 3. переключение страницwith
currentIndex() 1
ненадежен; 4. он не использует менеджеры макетов и не осведомлен о проблемах с масштабированием шрифтов;3. 5. переключение между страницами должно быть обязанностью не дочернего элемента, а его родителя; кроме того, использование общей «глобальной»
widget
ссылки в методе экземпляра нехорошо и может привести к ошибкам имен и последующим сбоям; 6. запросы к базе данных непроверены, плохо сконструированы и небезопасны; 7.try/except
блок в конце просто неправильный , так как у вас нет возможности узнать, что пошло не так, если программа выйдет из строя. Это всего лишь несколько примеров (в оригинале еще больше проблем); Мне жаль вас, я пытался связаться с автором, но, похоже, им действительно все равно, так как я не получил ответа.