Форум сайта python.su
Добрый вечер! Создаю примитивную авторизационную форму (вход пользователя через ввод логина и пароля) на 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_())
Отредактировано Jeks (Апрель 4, 2018 19:08:43)
Офлайн
ИМХО у вас вообще в коде какаято содомия. В первом модуле вы импортируете второй, а во втором первый но в первом вы импортируете второй… Такого быть не должно. вы должны абстрагироваться и разбить задачу на несколько частей. В идеале модули(окна) вообще не должны знать о существовании друг друга и только “общаться” между собой. У КуТе для этого есть достаточно удобная система сигналов и слотов. Хотя есть и иные варианты.
Тоесть “окно авторизации” должно уметь две вещи: скушать логин-пароль, и предать эти данные другому модулю(авторизации), с помощью каллбека или сигнала. Модуль авторизации должен уметь принять логин-пароль, проверить и вернуть соответственно прошли авторизацию или нет. И третий модуль“Окно системы менеджмента пользователей” должен уже заниматься менеджментом.
А потом вы пишете “главный модуль”, который все этим рулит, он создает экземпляр окна авторизации, и экземпляр модуля валидации, и соедияет их с помощь сигналов\слотов(или иным другим удобным для вас способом). И если модуль валидации дает добро то создает экзепляр уже окна “системы менеджмента пользователей” в котром пользователь уже работает.
Тем самым вы решаете кучу проблем сразу в том числе и при возврате к первому окну из второго окна через кнопку “Выйти”(def Back)
[code python][/code]
Отредактировано PEHDOM (Янв. 31, 2018 11:29:08)
Офлайн
Уважаемый PEHDOM, спасибо за ответ и описание ключевых принципов гибкой архитектуры ПО. Прошу прощения за знакомство с мазохистской стороной моей личности, проявляющейся в уг коде))) Лишь недавно начал практиковаться в PyQt, но заметил, что сложно найти хороший источник для изучения Qt Designer и PyQt.
У КуТе для этого есть достаточно удобная система сигналов и слотов. Хотя есть и иные варианты. То есть “окно авторизации” должно уметь две вещи: скушать логин-пароль, и передать эти данные другому модулю(авторизации), с помощью каллбека или сигнала.В таком случае, не могли бы вы, пожалуйста, порекомендовать мне литературу, видеоуроки или примеры на данную тему, которые не плохо бы раскрыли данный вопрос для обучающегося. Можно и на английском языке, я не возражаю.
А потом вы пишете “главный модуль”, который всем этим рулит, он создает экземпляр окна авторизации, и экземпляр модуля валидацииИ на данную тему тоже.
Отредактировано Jeks (Янв. 31, 2018 13:59:29)
Офлайн
Jeksпро pyQT обычно все используют документацию к QT, там на самом деле все одинаков, имена классов, методов, атрибутов и прочее.. http://doc.qt.io/ или http://doc.crossplatform.ru/qt/
что сложно найти хороший источник для изучения Qt Designer и PyQt.
Jeksа тут все просто, это ровно тот же принцип по которому вы строите свои окна. Вот в вашем коде есть QLineEdit-ы, QPushButton-ы, QLabel-ы и прочее, они вообще не знают о существовании друг друга. Вы же пишете “главную программу” в которой создаете экземпляры этих классов, помещаете их на форму, а также что они должны делать в той или иной ситуации. По типу если нажали кнопку, взять текст из QLineEdit, и передать его в QLabel.
И на данную тему тоже.
[code python][/code]
Офлайн