首页 > 解决方案 > 使用 pyinstaller 构建 onefile 后 QSettings 不起作用

问题描述

我在构建脚本的 pyinstaller onefile 版本时遇到问题,我的复选框状态未保存,但另一方面,当 pyinstaller 使用文件构建普通 exe 时,复选框状态已保存并且可以正常工作。

请注意,我正在使用 resources(package)>__init__.py来存储我的图标和 config.ini,并且这些图标在 onefile 或正常构建两种情况下都有效。

项目文件图片

__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()

标签: pythonpyqtpyqt5pyinstallerqsettings

解决方案


用户 Numerlor 在 Python Discord 的 stackoverflow 之外回答

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)


推荐阅读