Kivy编译为exe后config.ini设置不生效,窗口仍可调整求助
解决Kivy打包成exe后窗口可调整大小的问题
你的问题根源在于:Kivy启动时会优先加载用户目录下自动生成的.kivy/config.ini配置,而你代码里用的Config.setdefault()只会在配置项不存在时才生效——如果用户目录已经有resizable=1的配置,这个方法不会覆盖它,导致打包后的exe窗口仍可调整。
下面是几个永久解决的方案:
方案1:强制覆盖配置(最简单有效)
把代码里的setdefault替换成set,这个方法不管配置项是否存在,都会强制设置你指定的值,彻底覆盖默认配置:
from kivy.config import Config import os _local_dir = os.path.dirname(os.path.abspath(__file__)) Config.read(_local_dir + '/config.ini') # 用set替代setdefault,强制设置配置 Config.set('input', 'mouse', 'mouse,multitouch_on_demand') Config.set('graphics', 'resizable', '0') Config.set('graphics', 'show_taskbar_icon', '0') # 关键:这段代码必须放在App类实例化之前执行 # 可选:如果需要把修改写入配置文件,避免下次启动被默认值覆盖 Config.write()
方案2:打包时嵌入自定义配置文件
把你的本地config.ini打包进exe,让Kivy优先加载这个打包后的配置,而不是用户目录的默认配置:
- 确保本地
config.ini里已经正确设置:
[graphics] resizable = 0 show_taskbar_icon = 0 [input] mouse = mouse,multitouch_on_demand
- 修改代码,让程序在打包后能找到嵌入的配置文件:
from kivy.config import Config import os import sys # 获取打包后的资源路径(PyInstaller会把资源放在_MEIPASS目录) if hasattr(sys, '_MEIPASS'): _local_dir = sys._MEIPASS else: _local_dir = os.path.dirname(os.path.abspath(__file__)) # 优先加载打包的配置文件 Config.read(os.path.join(_local_dir, 'config.ini')) # 保险起见,再强制设置关键项 Config.set('graphics', 'resizable', '0')
- 用PyInstaller打包时,在spec文件里添加资源引用:
a = Analysis( # 你的其他配置... ) # 把config.ini添加到打包资源中 a.datas += [('config.ini', 'path/to/your/local/config.ini', 'DATA')] pyz = PYZ(a.pure, a.zipped_data) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, # 你的其他打包配置... )
方案3:禁止Kivy生成用户目录配置(彻底自定义)
如果不需要Kivy在用户目录生成任何配置文件,可以在代码最开头设置环境变量,让Kivy完全使用你代码里的配置:
import os # 禁止Kivy加载和生成用户目录的配置文件 os.environ['KIVY_NO_CONFIG'] = '1' from kivy.config import Config Config.set('input', 'mouse', 'mouse,multitouch_on_demand') Config.set('graphics', 'resizable', '0') Config.set('graphics', 'show_taskbar_icon', '0')
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

