@idkwhichnickname

Графический Интерфейс?

Короче, хочу сделать миниассистента который будет включать браузер когда я буду нажимать на кнопку. Суть такова - сделал в Qt Designer 4 графических интерфейса, конвертировал их в .py и мне удалось только открыть один графический интерфейс, нажав на кнопку "Продолжить" ничего не происходит, а запрограммировано чтобы открывался следующий графический интерфейс.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from assistentv2 import Ui_Assistent
from password import Ui_Password
from readypassword import Ui_ReadyPassword
from sites import Ui_Sites

app = QtWidgets.QApplication(sys.argv)


Assistent = QtWidgets.QDialog()
ui = Ui_Assistent()
ui.setupUi(Assistent)
Assistent.show()

# logic..
def Password():
	global Password
	Password = QtWidgets.QDialog()
	ui = Ui_Password()
	ui.setupUi(Password)
	assistentv2.close()
	Password.show()


sys.exit(app.exec_())
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
@bbkmzzzz
def Password():
  global Password # ???? <- читаем про области видимости и забываем, что есть global, вообще, совсем
  Password = QtWidgets.QDialog() # Вы понимаете, что внутри функции Password, вызывается функция Password?
  ui = Ui_Password() # Создали ЛОКАЛЬНУЮ переменную ui, которая уничтожится после завершения функции
  ui.setupUi(Password)
  assistentv2.close()
  Password.show() # Вопрос на засыпку, а чем является Password? И есть ли у него метод show?

sys.exit(app.exec_())

Не будет это все работать. Дичь в функции Password, да и не вызывается нигде она. Нет понимания, как работает Python и Qt. Вопрос уже был, там только про идеи, но сейчас хоть какой-то код есть.

Что делать?
0. Читаем Лутца. Ссылка на книгу есть в прошлом вопросе. (спиратить тоже можно, в принципе)
1. Не использовать global, вообще и никогда, пока не будет четкого понимания, зачем это нужно.
2. Классы Python. Без понимания, как они работают - Qt рано, ведь дальше начнутся сигналы\слоты. Необходимость global исчезнет, как только разберетесь с классами и областями видимости.
3. Почитайте про конструкцию if __name__ == "__main__": , что это, и зачем надо.
Все это есть у Лутца

4. Сигналы и слоты Qt.
######################

Базовый набор.

Необязательно. Пример конвертированного ui файла, pyuic на выходе выдает python класс.
Можно загружать напрямую и ui, но тогда преобразование будет происходить при каждом запуске, и IDE не сможет подсказывать и дополнять.
# файл называется Ui_after_pyuic.py
from PyQt5.QtCore import QRect, QMetaObject
from PyQt5.QtWidgets import QLineEdit, QPushButton, QApplication


class Ui_Class(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(382, 201)
        self.lineEdit = QLineEdit(Dialog)
        self.lineEdit.setGeometry(QRect(10, 10, 251, 31))

        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QPushButton(Dialog)
        self.pushButton.setGeometry(QRect(270, 10, 101, 31))

        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle("Dialog")
        self.pushButton.setText("Проверка")


# файл my_genius_logic.py
class MyClass:
    def __init__(self):
        self.hello = "Hello World"

    def get_hello(self):
        return self.hello


if __name__ == "__main__":
    cls = MyClass()
    print(cls.get_hello())


import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from Ui_after_pyuic import Ui_Class
from my_genius_logic import MyClass

class Main(QMainWindow):  # Основной класс программы, наследуемся от того, что требуется, может и QDialog
                          # разбираемся, чем QMainWindow отличается от QDialog
    def __init__(self):  # "конструктор" - читаем про классы
        super(Main, self).__init__() # инициализация базового класса, читаем про классы, наследование

        # опционально заполняем интерфейс преобразованным в питонячий класс .ui файл после дизайнера
        self.ui = Ui_Class() # экземпляр класса с виджетами
        self.ui.setupUi(self) # "установка" виджетов

        self.genius_logic = MyClass() # создадим экземпляр нашего класса с логикой

        self.ui.pushButton.clicked.connect(self._on_button_clicked) #  вот они сигналы\слоты Qt. Упрощенно:
        """ 
       у виджетов (и не только, все наследники QObject)  в Qt есть возможность испускать сигналы ("основа" всего Qt)
        сигнал испускается, попадает в цикл событий - далее Qt смотрит, есть ли подписчик у это этого сигнала?
        подписчик/обработчик/слот - если он есть - он вызовется
        у стандартных виджетов есть базовый набор сигналов, которые они могут испускать, например, при 
        клике на QPushButton испустится  сигнал clicked, его мы дальше и будем обрабатывать.
        Нужно обратить внимание, что метод connect принимает аргументом callable объект, т.е. такой объект, который можно вызвать. 
        внимательно со скобками, не нужно вызывать объект при создании связи сигнал-слот, ведь идея в том, что Qt сам все вызовет, когда потребуется.
        """

    def _on_button_clicked(self): #  а вот и обработчик нашей кнопки, он же слот
            '''
            тут мы будем обрабатывать нажатие на нашу кнопку
            нужно обратить внимание, что сигналы могут передавать данные, передаются они в виде аргументов 
            вызываемого слота, тогда обработчик должен уметь это обрабатывать.
            '''
            print(self.genius_logic.get_hello())
            #  выводим в консоль результат работы метода get_hello экземпляра 
            #  класса MyClass, который "содержится" в поле genius_logic нашего основного класса Main

if __name__ == '__main__':
    app = QApplication(sys.argv) #  создаем экземпляр приложения Qt, которое и будет обрабатывать все события
    ex = Main()
    ex.show() # Можно перенести в другое место, в зависимости от потребностей отображает виджет на экране.
    sys.exit(app.exec_()) # app.exec_() - запуск цикла обработки событий


Выносим логику работы ассистента в отдельный класс. Продумываем методы, поля, да и в целом поведение. Желательно, что бы он мог работать независимо от интерфейса, отделяем логику от отображения.
Надеюсь, это поможет хоть приблизительно понять, как работает Qt, и что основы ЯП сильно желательно знать прежде, чем разбираться с подобными фреймворками. Да и получился мини гайд по Qt, может кому еще пригодится, если кто-то наткнется на этот вопрос)

Документация по Qt на английском языке, на русском информации не особо много, подтягиваем английский.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Surv16893
Тебе нужно под каждый интерфейс свой экземпляр класса для начала.
Пример того, что тебе нужно https://ru.stackoverflow.com/questions/992221/Откр...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
27 сент. 2020, в 00:32
20000 руб./за проект
26 сент. 2020, в 23:26
2000 руб./за проект
26 сент. 2020, в 21:27
100000 руб./за проект