Настройка параметров оконного приложения. Работа с диалоговым окном в PyQt5.

Параметры — это всегда простор для фантазии. Можно ограничить себя и задать параметр жестко (захардкодить, как говориться), но это не дружественно по отношению к пользователю приложения. Поэтому все таки лучше позволить установить подходящие значения в отдельном окне, если, например, речь идет об оконном приложении на python с использованием PyQt5.

Подход к хранению и изменению параметров в оконном приложении на python с использованием PyQt5

Для хранения всех параметров приложения будет использовать иерархическую структуру — вложенные словари. Хранить параметры удобно в файле на диске в формате yaml.

import yaml
config = {"main_parameters":
    {
        "param1": 1,
        "param2": 100,
        "param3": "text"
    }
}
with open("settings/params.yaml", "w") as f:
    yaml.dump(config, f)

В приложении QtDesigner создадим окно Dialog with Buttons, в результате чего на окно будет добавлен объект QDialogButtonBox, по умолчанию получивший имя buttonBox. Этот класс является настраиваемым контейнером для набора стандартных кнопок, таких как Ok и Cancel. В параметрах QDialogButtonBox в списке StandardButtons должны быть установлены галочки кнопок Ok, Cancel. Сохраним макет окна в файл params.ui.

Преимуществом использования класса QDialogButtonBox является возможность не задумываться о том, в какой операционной системе будет работать программа. То есть расположение стандартных кнопок будет соответствовать макету, принятому в используемой операционной системе, также на кнопка будут по умолчанию иконки, соответствующие их предназначению.

Создадим в файле settings.py класс Settings на основе класса QDialog из модуля PyQt5.QtWidgets. При инициализации класса ему будет передана ссылка на родительское окно и параметры в виде словаря.

У класса Settings должна быть переопределена функция __init__, определена функция view_params для заполнения всех необходимых полей параметров в диалоговом окне, а также функция check_params для проверки введенных параметров на соответствие требованиям к ним. Если в измененных параметрах пользователь ввел ошибочные значения, то при нажатии на кнопку ОК появится сообщение об ошибке и окно не будет закрыто. Окно закроется и параметры будут сохранены когда все ошибочно введенные значения будут исправлены. Чтобы получить ожидаемое поведение при использовании контейнера QDialogButtonBox нужно Внимание! переопределить функцию accept(). Если проверку параметров выполнить только в событии clicked, то не зависимо от результатов проверки диалоговое окно параметров закроется.

from PyQt5.QtWidgets import QDialog, QMessageBox
from PyQt5 import uic
class Settings(QDialog): 
    def __init__(self, parent, config):
        super().__init__(parent=parent)
        self.config = config
        uic.loadUi("params.ui", self)
        self.status = True
        self.view_params()
    def view_params(self):
       # заполняем поля использую значения из словаря 
       # self.config
       code

    def check_params(self):
       self.status = True
       info_string = ""
       
       if в параметрах ошибки:
          self.status = False
          info_string += f"Текст ошибки\n"

        if self.status:
            self.done(QDialog.Accepted)            
        else:
            dialog = QMessageBox(QMessageBox.Warning,
                     "Ошибка ввода параметров",
                      info_string,
                      buttons=QMessageBox.Ok | 
                              QMessageBox.Cancel,
                     parent=self)            
            dialog.exec()

    
    def accept(self):
        self.check_params()

   

В меню приложения создаем пункт Настройки и в его обработчике (функция browse_params) открываем диалоговое окно, которое определено классом Settings.

def browse_params(self):  
    window = Settings(self, self.config)
    res = window.exec()
    if res == QtWidgets.QDialog.Accepted:
         print("save new", self.config)
         with open("settings/params.yaml", "w") as f:
              yaml.dump(self.config, f)

Дополнительная информация. Обработчики событий.

self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self.check_params)
self.buttonBox.accepted.connect(self.check_params)

Добавить комментарий