Как сделать так, чтобы экран появлялся после события с помощью PyQt5?

#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 блок в конце просто неправильный , так как у вас нет возможности узнать, что пошло не так, если программа выйдет из строя. Это всего лишь несколько примеров (в оригинале еще больше проблем); Мне жаль вас, я пытался связаться с автором, но, похоже, им действительно все равно, так как я не получил ответа.