Kivy程序经Nuitka编译为EXE后窗口缩放禁用失效求助
解决Kivy应用经Nuitka编译后仍可缩放窗口的问题
针对你遇到的Kivy应用在代码和ini配置禁用缩放,但Nuitka编译为exe后仍能缩放的问题,可以从以下几个方向排查和解决:
1. 修正Kivy配置的加载顺序与生效逻辑
Kivy的配置设置需要在App初始化前完成,且需确保配置被正确写入,避免被后续加载的内容覆盖。调整代码顺序如下:
# 优先加载并配置Kivy核心参数 from kivy.config import Config # 全局禁用窗口缩放,设置固定尺寸 Config.set('graphics', 'resizable', 0) Config.set('graphics', 'width', 500) Config.set('graphics', 'height', 700) Config.write() # 将配置写入本地,确保运行时生效 # 再导入其他Kivy模块 from kivy.app import App from kivy.core.window import Window from kivy.lang import Builder # ...其余导入内容 os.chdir(os.path.dirname(__file__)) _local_dir = os.path.dirname(os.path.realpath(__file__)) Config.set('input', 'mouse', 'mouse,multitouch_on_demand') Builder.load_file(_local_dir + '/kivy.kv') # 再次确认窗口属性,防止被kv文件或其他逻辑覆盖 Window.resizable = False Window.size = (500, 700)
2. 检查kv文件是否存在冲突配置
打开你的kivy.kv文件,确认是否存在覆盖窗口属性的代码,比如:
Window: resizable: True
如果有这类配置,直接删除或改为resizable: False。
3. Nuitka编译时打包自定义配置文件
默认情况下,Nuitka可能不会自动打包你的kivy.ini,导致exe运行时加载系统默认配置。编译时添加参数指定打包配置文件:
nuitka --standalone --onefile --include-data-file=kivy.ini=. your_app.py
此命令会将当前目录的kivy.ini打包到exe同目录,确保程序运行时加载自定义配置。
4. 用Windows API直接锁定窗口样式(兜底方案)
如果以上方法仍无效,可通过ctypes调用Windows系统API,直接禁用窗口的最大化按钮和调整大小功能,绕过Kivy的封装限制:
在你的App类的build方法末尾添加以下代码:
class YourApp(App): def build(self): # ...你的原有build逻辑 root = Builder.load_file(_local_dir + '/kivy.kv') # 调用Windows API锁定窗口 import ctypes hwnd = Window.get_window_info().window_handle GWL_STYLE = -16 WS_MAXIMIZEBOX = 0x00010000 # 最大化按钮样式 WS_THICKFRAME = 0x00040000 # 可调整边框样式 current_style = ctypes.windll.user32.GetWindowLongW(hwnd, GWL_STYLE) # 移除最大化和可调整样式 new_style = current_style & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME ctypes.windll.user32.SetWindowLongW(hwnd, GWL_STYLE, new_style) # 刷新窗口样式生效 ctypes.windll.user32.SetWindowPos(hwnd, 0, 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0004 | 0x0010) return root
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

