Ответы пользователя по тегу Python
  • Как установить отношения между родительским и дочерним окном в Python QT?

    chuikoalex
    @chuikoalex
    Викторович
    Давай по задачам:
    1. "открывается только одно дочернее окно" - я бы рекомендовал наследоваться не от QMainWindow, а от QDialog:
    class Dialog(QtWidgets.QDialog, untitled2.Ui_Dialog):

    тогда открытое окно будет блокировать родительское и ты спокойно можешь в нем работать (но если вдруг предусматривается работа в двух окнах сразу, то тогда - зачем вообще второе диалоговое окно?! делай две области в родительском и работай там)

    2. "дочерней передается переменная" - у класса Dialog, в методе _init передай эту переменную:
    def __init__(self, parent, connect_sql): 
        self.connect_sql = connect_sql

    и всё, дальше с ней работаешь.

    3. "из дочки были доступны свойства виджетов родителя" - для этого ты и передаешь в классе Dialog, в методе _init аргумент parent (= two.Dialog(self) - вот этот self это и есть ссылка на родителя) только не забудь:
    def __init__(self, parent, connect_sql): 
        self.parent = parent
        self.connect_sql = connect_sql

    и тогда ты сможешь обратиться к объекту родителя
    self.parent.label.setText("информация передана из дочернего окна")
    (предполагается конечно что у родителя есть объект label = QLable)

    НО такая взаимосвязь в корне ошибочна! (читать если скучно... :))
    spoiler
    Пока программа маленькая ок, но как только все разрастется ты умрешь отслеживать, что от кого куда передалось и главное почему! При разработке больших приложений нужно использовать определенные паттерны в построении взаимосвязей. Model-View-Controller (MVC) - если коротко когда ты делишь все приложение на три логических объекта Модель (она занимается всеми расчетами и переработками данных), Интерфейс (View - в данном случае это библиотека QT) он получает сигналы и данные от пользователя и передает их в Модель. И Controller, который связывает Модель и Интерфейс. Причем в идеале Модель вообще ни чего не знает от двух других и просто сообщает об изменении своего состояния и готовности обработанных данных, а Контролер который подписан на Модель (паттерн Наблюдатель) следит за этими изменениями и реагирует когда нужно.


    И последний совет при создании файлов интерфейсов (дизайнов) untitled всем объектам давай понятные имена, чтобы потом читая код было ясно для чего этот элемент используется.
    self.button_open_dialog.clicked.connect(self.browse) - ну хотя бы как-то так (а в идеале что именно за диалог)
    Ответ написан
    Комментировать
  • Как сделать, чтобы дочерняя форма помнила свое состояние при повторном открытие?

    chuikoalex
    @chuikoalex
    Викторович
    Ну если понудеть, то сразу вопрос какие аргументы у состояния? Размер, положение, текст по умолчанию в LineEdit.
    1. Простой выход: создай словарь "состояний", в котором по ключу - названию диалогового окна, можно будет хранить данные о его состоянии (этот вариант если программа простая, и хранить состояние нужно только на время работы приложения).
    2. Если программа большая, то Евгений говорит правильно создай класс который наследуется от QDialog и при создании его экземпляров (диалоговых окон) каждое из них будет хранить состояние в себе (тоже только на время работы приложения ибо при перезапуске состояния будут дефолтными).
    3. Если прям нужно для сохранения перезапуска, то тут будет правильным создать конфигурационный файл .ini .yaml - кто что любит :)) Ну или словарь из п.1. можно просто сохранить с помощью модуля pickle.
    Ответ написан
    Комментировать
  • Как получить список из словаря по ключу из JSON файла?

    chuikoalex
    @chuikoalex
    Викторович
    templates = json.load(f) когда это строка выполнилась, то templates стал словарем полученным из файла (ну если упростить).
    ListLenght = len(section[select]) у тебя же section это ключ ("key1", "key2"...), который ты достал из из templates, с помощью метода .items() а ты пытаешь работать с ним как со словарем.
    Вместо:
    for section, commands in templates.items():
            ListLenght = len(section[select])
            print("В данном разделе ",ListLenght,"значений")

    просто:
    print("В данном разделе ", len(templates[select]), "значений")
    Ответ написан
    Комментировать