【问题标题】:QSettings doesn't work after building onefile using pyinstaller使用 pyinstaller 构建 onefile 后 QSettings 不起作用
【发布时间】:2020-04-30 16:35:55
【问题描述】:

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

请注意,我正在使用资源(包)>__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()

【问题讨论】:

  • resources是什么,提供一个minimal reproducible example,显示resources.py的内容。你的 Python、PyQt5、Pyinstaller 版本是什么?
  • 你的代码产生了很多错误
  • 这是一个确定的代码,可以显示我的整个 GUI 太长的代码。我正在使用 Pyinstaller 3.6,PyQt5 12.7.0
  • 我没有问你项目的代码,我问你要一个 MRE,如果你的项目很小,那么它可以是一个 MRE,但如果你的项目看起来像你的情况一样大那么你必须创建一个新项目来具体解决问题。
  • 将使可工作的代码少之又少。

标签: python pyqt pyqt5 pyinstaller qsettings


【解决方案1】:

用户 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2012-01-22
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多