python - 使用 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()
解决方案
用户 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)
推荐阅读
- python - 如何在我的代码中包含来自 argparse 的 Nargs 而不会出错?
- java - maven maven-bundle-plugin - Bundle-Version 的值无效
- javascript - 如何将有收入的交易添加到列表中?
- sql-server - 适用于 Windows 的 Docker 桌面 - 获取 Sqlcmd:'DATABASE':未知选项
- php - 使用 REST API 而不是我的简单方法有什么好处?
- cloud - 关于 AEM 中的 SlingRequestProcessor 作为云服务的问题不支持?
- google-play - 1 个应用程序如何在 2 个 admob 帐户上显示多个 app-ads.txt?
- react-native - 无法“npm install @tensorflow/tfjs-react-native”expo cli 或 react-native cli
- internet-explorer-11 - Internet Explorer 11 意外下载 URL
- xslt - xsl 匹配或条件