QSettings не работает после сборки одного файла с помощью pyinstaller - PullRequest
0 голосов
/ 14 января 2020

У меня возникла проблема при создании версии моего скрипта pyinstaller onefile, мое состояние флажка не сохраняется, но, с другой стороны, когда pyinstaller собирает обычный exe-файл с файлами, состояние флажка сохраняется и работает отлично.

Обратите внимание, что я использую ресурсы (пакет)> __init__.py для хранения своих значков и файла config.ini, и значки работают в обоих случаях: один файл или обычная сборка.

Изображение файлов проекта

__init__.py contents

from pathlib import Path

resources = Path(__file__).parent

config_ini = resources / "config.ini"

My PyQt5 Gui.

import sys

from PyQt5.QtCore import QSettings

import resources

import PyQt5.QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *



settings = QSettings(str(resources.config_ini), QSettings.IniFormat)


class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.main_ui()
        self.buttons()
        self.layout()
        self.show()
        settings.sync()


    def main_ui(self):
        self.setWindowTitle("Files Organizer")

    def buttons(self):
        self.checkbox_startup = QCheckBox("Run on start up")

        self.checkbox_startup.setChecked(False)
        self.checkbox_startup.setChecked(settings.value("startup_state", type=bool))

        self.checkbox_startup.toggled.connect(self.startup_settings)

    def layout(self):
        self.horizontalGroupBox_options = QGroupBox("Options", self)
        verticalbox_options = QVBoxLayout()
        verticalbox_options.addWidget(self.checkbox_startup)
        self.horizontalGroupBox_options.setLayout(verticalbox_options)
        self.horizontalGroupBox_options.resize(360, 80)
        self.horizontalGroupBox_options.move(20, 110)

    def startup_settings(self):
        startup_state = self.checkbox_startup.isChecked()
        settings.setValue("startup_state", startup_state)
        print("startup state is ", settings.value("startup_state", type=bool))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    screen = Window()
    screen.show()
    app.exec()

1 Ответ

0 голосов
/ 14 января 2020

Отвечено за пределами стекового потока на Python Discord пользователя Numerlor

onefile работает путем извлечения его содержимого во временный каталог, путь которого хранится в sys._MEIPASS. Таким образом, установка значений в resources.config_ini изменяет только извлеченный файл, который удаляется после закрытия программы.

У qt есть набор путей в QtCore.QStandardPaths.writableLocation, которые могут быть там, где вы хотите сохранить конфигурацию, например QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.AppConfigLocation), который возвращает .../appdata/local/{org}/{app}

Эти строки добавляются в начале GUI.

# This return .../appdata/local
local_path = QStandardPaths.writableLocation(QStandardPaths.AppConfigLocation) 
# Make directory for my program
os.makedirs(local_path + "\\" + "FilesOrganizer", exist_ok=True) 
# Making config.ini file.
config_path = local_path + "\\" + "FilesOrganizer" + "\\" + "config.ini" 
settings = QSettings(config_path, QSettings.IniFormat)

...