Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt5 |Qt Designer | Переход из окна к окну через кнопку [RSS Feed]

#1 Янв. 30, 2018 19:01:23

Jeks
Зарегистрирован: 2018-01-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 |Qt Designer | Переход из окна к окну через кнопку

Добрый вечер! Создаю примитивную авторизационную форму (вход пользователя через ввод логина и пароля) на Qt Designer (PyQt5 и Python 3.6). Возникла проблема с переходом из первого окна (“Окно авторизации пользователя, где вводятся данные пользователя: логин и пароль”) ко второму окну (“Окно системы менеджмента пользователей - чтобы админ удалял или создавал пользователей”). Два окна созданы в разных модулях (первое - QMainWindows, второе - QDialog without buttons). При запуске программы ввожу данные пользователя в поля первого окна и нажимаю кнопку “войти”. Открывается внешний терминал (cmd) с сообщением о невозможности импортировать класс Ui_Dialog1 (он мне нужен для возврата к первому окну из второго окна через кнопку “Выйти” (def Back) - прописан во второй форме). Как можно решить проблему с импортированием класса? И полагаю у меня возникнут проблемы еще и при возврате к первому окну из второго окна через кнопку “Выйти”(def Back) . Тем не менее прикладываю формы к письму:
Первое окно/модуль (“Окно авторизации пользователя”):

 from PyQt5 import QtCore, QtGui, QtWidgets
import sqlite3
from admin_login import Ui_Dialog1
class Ui_log_in(object):
    def setupUi(self, log_in):
        log_in.setObjectName("log_in")
        # Идет много кода
    def retranslateUi(self, log_in):
        _translate = QtCore.QCoreApplication.translate
        # Идет много кода
    def showMessageBox(self, title, message):                   # Выводит сообщение о неверной авторизации
        msgBox = QtWidgets.QMessageBox()
        # Идет много кода
        
    def User_Admin(self):                                       # Заходит в окно Администратора после авторизации
        self.Menu_AdminWindow = QtWidgets.QDialog()
        self.ui = Ui_Dialog1()
        self.ui.setupUi(self.Menu_AdminWindow)
        log_in.hide()
        self.Menu_AdminWindow.show()
        
    def LoginCheck(self):                                       # Процесс авторизации пользователя
        # Идет много кода
            
    def Exit(self):                                             # Выход из программы
        print('Exit Button is Clicked')
        log_in.close()
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    log_in = QtWidgets.QMainWindow()
    ui = Ui_log_in()
    ui.setupUi(log_in)
    log_in.show()
    sys.exit(app.exec_())
Второе окно/модуль(“Окно системы менеджмента пользователей”):
 from PyQt5 import QtCore, QtGui, QtWidgets
from log_in import Ui_log_in
class Ui_Dialog1(object):
    def setupUi(self, Dialog1):
        # Идет много кода
        self.retranslateUi(Dialog1)
        QtCore.QMetaObject.connectSlotsByName(Dialog1)
    def retranslateUi(self, Dialog1):
        _translate = QtCore.QCoreApplication.translate
        # Идет много кода
        
    def Back(self):
        self.log_inWin = QtWidgets.QMainWindow
        self.ui = Ui_log_in()
        self.ui.setupUi(self.log_inWin)
        self.log_inWin.show()
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog1 = QtWidgets.QDialog()
    ui = Ui_Dialog1()
    ui.setupUi(Dialog1)
    Dialog1.show()
    sys.exit(app.exec_())

И собственно саму ошибку вывода на внешнем терминале:


P.S. Есть еще примитивная база пользователей написанная посредством импортированной библиотеки sqlite3, но полагаю ее нет смысла выкладывать для решения возникшей проблемы. Надеюсь на вашу помощь

Отредактировано Jeks (Апрель 4, 2018 19:08:43)

Офлайн

#2 Янв. 31, 2018 11:27:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 |Qt Designer | Переход из окна к окну через кнопку

ИМХО у вас вообще в коде какаято содомия. В первом модуле вы импортируете второй, а во втором первый но в первом вы импортируете второй… Такого быть не должно. вы должны абстрагироваться и разбить задачу на несколько частей. В идеале модули(окна) вообще не должны знать о существовании друг друга и только “общаться” между собой. У КуТе для этого есть достаточно удобная система сигналов и слотов. Хотя есть и иные варианты.
Тоесть “окно авторизации” должно уметь две вещи: скушать логин-пароль, и предать эти данные другому модулю(авторизации), с помощью каллбека или сигнала. Модуль авторизации должен уметь принять логин-пароль, проверить и вернуть соответственно прошли авторизацию или нет. И третий модуль“Окно системы менеджмента пользователей” должен уже заниматься менеджментом.
А потом вы пишете “главный модуль”, который все этим рулит, он создает экземпляр окна авторизации, и экземпляр модуля валидации, и соедияет их с помощь сигналов\слотов(или иным другим удобным для вас способом). И если модуль валидации дает добро то создает экзепляр уже окна “системы менеджмента пользователей” в котром пользователь уже работает.
Тем самым вы решаете кучу проблем сразу в том числе и при возврате к первому окну из второго окна через кнопку “Выйти”(def Back)




==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 31, 2018 11:29:08)

Офлайн

#3 Янв. 31, 2018 13:04:53

Jeks
Зарегистрирован: 2018-01-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 |Qt Designer | Переход из окна к окну через кнопку

Уважаемый PEHDOM, спасибо за ответ и описание ключевых принципов гибкой архитектуры ПО. Прошу прощения за знакомство с мазохистской стороной моей личности, проявляющейся в уг коде))) Лишь недавно начал практиковаться в PyQt, но заметил, что сложно найти хороший источник для изучения Qt Designer и PyQt.

У КуТе для этого есть достаточно удобная система сигналов и слотов. Хотя есть и иные варианты. То есть “окно авторизации” должно уметь две вещи: скушать логин-пароль, и передать эти данные другому модулю(авторизации), с помощью каллбека или сигнала.
В таком случае, не могли бы вы, пожалуйста, порекомендовать мне литературу, видеоуроки или примеры на данную тему, которые не плохо бы раскрыли данный вопрос для обучающегося. Можно и на английском языке, я не возражаю.
А потом вы пишете “главный модуль”, который всем этим рулит, он создает экземпляр окна авторизации, и экземпляр модуля валидации
И на данную тему тоже.

Отредактировано Jeks (Янв. 31, 2018 13:59:29)

Офлайн

#4 Янв. 31, 2018 15:34:07

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 |Qt Designer | Переход из окна к окну через кнопку

Jeks
что сложно найти хороший источник для изучения Qt Designer и PyQt.
про pyQT обычно все используют документацию к QT, там на самом деле все одинаков, имена классов, методов, атрибутов и прочее.. http://doc.qt.io/ или http://doc.crossplatform.ru/qt/
есть еше Прохоренок, http://programming1189.ru/files/sc2013/Prohorenok.pdf (это старая версия, есть еще 2016-го года выпуска, там уже pyQT5, думаю гугл найдет без проблем) Но там больше справочник, с простыми примерами. Зато все на руском.
А так в инете куча мануалов на ту или иную тему например на русском доходчиво про сигналы и слоты
https://pythonworld.ru/gui/pyqt5-eventssignals.html в том числе как создавать свои сигналы, и подключать их.
Про каллбек, или функции обратного вызова дохрена теории https://ru.wikipedia.org/wiki/Callback_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
но на практике все просто http://python.su/forum/topic/24490/

Jeks
И на данную тему тоже.
а тут все просто, это ровно тот же принцип по которому вы строите свои окна. Вот в вашем коде есть QLineEdit-ы, QPushButton-ы, QLabel-ы и прочее, они вообще не знают о существовании друг друга. Вы же пишете “главную программу” в которой создаете экземпляры этих классов, помещаете их на форму, а также что они должны делать в той или иной ситуации. По типу если нажали кнопку, взять текст из QLineEdit, и передать его в QLabel.
А тут вы оперируете теми же классами но уже описывающих целые окна. По принципу, во показали пользователю окно1 класса LoginUI, если пользователь нажал в нем “ОК”, взять текст из окна1.поле1 както его обработать(например проверить на валидность логина-пароля), и в зависимости от результата, или закрыть окно1 и открыть окно2 класса UserAdminUI, или вывести в окно1 :“неверный пароль”.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

  • Начало
  • » GUI
  • » PyQt5 |Qt Designer | Переход из окна к окну через кнопку[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version