Сохранение настроек в питоне PyQt5
В окне есть меню. В меню есть вложенное меню. Во вложенном меню есть 3 действия (они объедены в QActionGroup).
Как сделать так - когда пользователь поменял настройки в меню, при выходе из приложения и снова при входе в приложение они сохранялись, чтобы пользователь опять их не настраивал. Буду очень благодарен !
Файл :
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import sys
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, action_search_options_1 = None, action_search_options_2 = None,
action_search_options_3 = None):
QtWidgets.QMainWindow.__init__(self)
# берём из функции create_menuBar QAction для работы с файлом window_1
self.action_search_options_1 = action_search_options_1
self.action_search_options_2 = action_search_options_2
self.action_search_options_3 = action_search_options_3
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 540)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_2 = QtWidgets.QPushButton("Перейти к генерации паролей")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_2)
self.formbox.setSpacing(20)
self.widget_page.setLayout(self.formbox)
# сделать главным комонентом в общем
return self.widget_page # возращает
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
# создание категорий меню и функционал в ней
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
# настройки поиска
self.action_search_options_1 = QtWidgets.QAction("Искать всё")
self.action_search_options_1.setCheckable(True)
self.action_search_options_1.setChecked(True)
self.action_search_options_2 = QtWidgets.QAction("Телефонные номера")
self.action_search_options_2.setCheckable(True)
self.action_search_options_3 = QtWidgets.QAction("Электронные почты и акк")
self.action_search_options_3.setCheckable(True)
self.group_action_1 = QtWidgets.QActionGroup(self.sub_menu_in_options_settings_1)
self.group_action_1.addAction(self.action_search_options_1)
self.group_action_1.addAction(self.action_search_options_2)
self.group_action_1.addAction(self.action_search_options_3)
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_1) # добавление в вложенное
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_2) # меню
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_3)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1) # добавление в меню опции
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_options)
# добавляем в окно
self.setMenuBar(self.menu)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
Update
Вроде всё правильно сделал для сохранения настроек, сам файл создаётся, я настройки не сохраняются, что может быть не так в коде
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import sys
from PyQt5.Qt import QSettings
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# создание файла для сохранения натроек
self.CONFIG_FILE_NAME = 'config.ini'
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 540)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.load_settings()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_2 = QtWidgets.QPushButton("Перейти к генерации паролей")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_2)
self.formbox.setSpacing(20)
self.widget_page.setLayout(self.formbox)
# сделать главным комонентом в общем
return self.widget_page # возращает
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
# создание категорий меню и функционал в ней
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
# настройки поиска
self.action_search_options_1 = QtWidgets.QAction("Искать всё")
self.action_search_options_1.setCheckable(True)
self.action_search_options_2 = QtWidgets.QAction("Телефонные номера")
self.action_search_options_2.setCheckable(True)
self.action_search_options_3 = QtWidgets.QAction("Электронные почты и акк")
self.action_search_options_3.setCheckable(True)
self.group_action_1 = QtWidgets.QActionGroup(self.sub_menu_in_options_settings_1)
self.group_action_1.addAction(self.action_search_options_1)
self.group_action_1.addAction(self.action_search_options_2)
self.group_action_1.addAction(self.action_search_options_3)
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_1) # добавление в вложенное
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_2) # меню
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_3)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1) # добавление в меню опции
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_options)
# добавляем в окно
self.setMenuBar(self.menu)
def save_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# возращаем значения
settings.setValue('BoolValue', int(self.action_search_options_1.isChecked()))
settings.setValue('BoolValue', int(self.action_search_options_2.isChecked()))
settings.setValue('BoolValue', int(self.action_search_options_3.isChecked()))
def load_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
self.action_search_options_1.setChecked(bool(int(settings.value('BoolValue', 0))))
self.action_search_options_2.setChecked(bool(int(settings.value('BoolValue', 0))))
self.action_search_options_3.setChecked(bool(int(settings.value('BoolValue', 0))))
def closeEvent(self, e):
self.save_settings()
super().closeEvent(e)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
Ответы (2 шт):
Вроде всё правильно сделал для сохранения настроек, сам файл создаётся, я настройки не сохраняются, что может быть не так в коде
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import sys
from PyQt5.Qt import QSettings
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# создание файла для сохранения натроек
self.CONFIG_FILE_NAME = 'config.ini'
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 540)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.load_settings()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_2 = QtWidgets.QPushButton("Перейти к генерации паролей")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_2)
self.formbox.setSpacing(20)
self.widget_page.setLayout(self.formbox)
# сделать главным комонентом в общем
return self.widget_page # возращает
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
# создание категорий меню и функционал в ней
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
# настройки поиска
self.action_search_options_1 = QtWidgets.QAction("Искать всё")
self.action_search_options_1.setCheckable(True)
self.action_search_options_2 = QtWidgets.QAction("Телефонные номера")
self.action_search_options_2.setCheckable(True)
self.action_search_options_3 = QtWidgets.QAction("Электронные почты и акк")
self.action_search_options_3.setCheckable(True)
self.group_action_1 = QtWidgets.QActionGroup(self.sub_menu_in_options_settings_1)
self.group_action_1.addAction(self.action_search_options_1)
self.group_action_1.addAction(self.action_search_options_2)
self.group_action_1.addAction(self.action_search_options_3)
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_1) # добавление в вложенное
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_2) # меню
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_3)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1) # добавление в меню опции
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_options)
# добавляем в окно
self.setMenuBar(self.menu)
def save_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# возращаем значения
settings.setValue('BoolValue', int(self.action_search_options_1.isChecked()))
settings.setValue('BoolValue', int(self.action_search_options_2.isChecked()))
settings.setValue('BoolValue', int(self.action_search_options_3.isChecked()))
def load_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
self.action_search_options_1.setChecked(bool(int(settings.value('BoolValue', 0))))
self.action_search_options_2.setChecked(bool(int(settings.value('BoolValue', 0))))
self.action_search_options_3.setChecked(bool(int(settings.value('BoolValue', 0))))
def closeEvent(self, e):
self.save_settings()
super().closeEvent(e)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
void QSettings::setValue(const QString &key, const QVariant &value)
Устанавливает значение установочного ключа на значение.
Если ключ уже существует, предыдущее значение будет перезаписано. Обратите внимание, что в реестре Windows и файлах INI используются ключи без учета регистра, в то время как API-интерфейс CFPreferences в macOS и iOS использует ключи с учетом регистра. Чтобы избежать проблем с переносимостью, ознакомьтесь с правилами раздела и синтаксиса ключа.
import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5.Qt import QSettings
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# создание файла для сохранения натроек
self.CONFIG_FILE_NAME = 'config.ini'
self.centralWidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralWidget)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 540)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.load_settings()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_2 = QtWidgets.QPushButton("Перейти к генерации паролей")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_2)
self.formbox.setSpacing(20)
self.widget_page.setLayout(self.formbox)
# сделать главным комонентом в общем
return self.widget_page # возращает
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
# создание категорий меню и функционал в ней
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
# настройки поиска
self.action_search_options_1 = QtWidgets.QAction("Искать всё")
self.action_search_options_1.setCheckable(True)
self.action_search_options_2 = QtWidgets.QAction("Телефонные номера")
self.action_search_options_2.setCheckable(True)
self.action_search_options_3 = QtWidgets.QAction("Электронные почты и акк")
self.action_search_options_3.setCheckable(True)
self.group_action_1 = QtWidgets.QActionGroup(self.sub_menu_in_options_settings_1)
self.group_action_1.addAction(self.action_search_options_1)
self.group_action_1.addAction(self.action_search_options_2)
self.group_action_1.addAction(self.action_search_options_3)
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_1) # добавление в вложенное
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_2) # меню
self.sub_menu_in_options_settings_1.addAction(self.action_search_options_3)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1) # добавление в меню опции
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_options)
# добавляем в окно
self.setMenuBar(self.menu)
def save_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# возращаем значения
# settings.setValue('BoolValue', int(self.action_search_options_1.isChecked()))
# settings.setValue('BoolValue', int(self.action_search_options_2.isChecked()))
# settings.setValue('BoolValue', int(self.action_search_options_3.isChecked()))
settings.setValue('BoolValue1', int(self.action_search_options_1.isChecked())) # BoolValue1
settings.setValue('BoolValue2', int(self.action_search_options_2.isChecked())) # BoolValue2
settings.setValue('BoolValue3', int(self.action_search_options_3.isChecked())) # BoolValue3
def load_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# self.action_search_options_1.setChecked(bool(int(settings.value('BoolValue', 0))))
# self.action_search_options_2.setChecked(bool(int(settings.value('BoolValue', 0))))
# self.action_search_options_3.setChecked(bool(int(settings.value('BoolValue', 0))))
self.action_search_options_1.setChecked(bool(int(settings.value('BoolValue1', 0)))) # BoolValue1
self.action_search_options_2.setChecked(bool(int(settings.value('BoolValue2', 0)))) # BoolValue2
self.action_search_options_3.setChecked(bool(int(settings.value('BoolValue3', 0)))) # BoolValue3
def closeEvent(self, e):
self.save_settings()
super().closeEvent(e)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
