Параметры — это всегда простор для фантазии. Можно ограничить себя и задать параметр жестко (захардкодить, как говориться), но это не дружественно по отношению к пользователю приложения. Поэтому все таки лучше позволить установить подходящие значения в отдельном окне, если, например, речь идет об оконном приложении на 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)