Windows10环境下免虚拟机免费将Python+Kivy项目打包为APP咨询
Kivy计算器Windows下免虚拟机打包解决方案
闪退原因&代码前置修复
你此前打包闪退主要有3个代码层面的问题,先修正后再打包即可:
- 类命名冲突:自定义应用类直接命名为
App,和导入的kivy官方App类重名,打包时类解析出错 - 安卓环境不兼容代码:
Window.size = (500,700)是Windows端窗口设置,安卓无此属性,运行到此处直接崩溃 - kv文件加载路径问题:手动调用
Builder.load_file在打包后的环境中容易出现路径找不到的问题
修正后calc.py代码
from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import ObjectProperty from kivy.lang import Builder from kivy.uix.screenmanager import Screen, ScreenManager from kivy.core.window import Window from kivy.uix.button import Button import platform # 仅Windows环境下设置窗口大小 if platform.system() == 'Windows': Window.size = (500,700) class MyLayout(Widget): pass class Screen1(Screen): def clear (self): self.ids.calc_input.text = "0" def button_press(self, button): prior = self.ids.calc_input.text if prior == "0": self.ids.calc_input.text = str(button) else: self.ids.calc_input.text = f'{prior}{button}' def math_sign(self, sign): prior = self.ids.calc_input.text self.ids.calc_input.text = f'{prior}{sign}' def remove(self): prior = self.ids.calc_input.text # 增加边界判断,避免空内容退格报错 if len(prior) <= 1: self.ids.calc_input.text = "0" else: self.ids.calc_input.text = prior[:-1] def dot(self): prior = self.ids.calc_input.text num_list = prior.split("+") if "." not in num_list[-1]: prior = f'{prior}.' self.ids.calc_input.text = prior def equals(self): prior = self.ids.calc_input.text try: answer = eval(prior) self.ids.calc_input.text = str(answer) except: self.ids.calc_input.text = "错误" class WindowManager(ScreenManager): pass # 重命名应用类,避免和父类重名 class CalculatorApp(App): def build(self): return WindowManager() if __name__ == "__main__": CalculatorApp().run()
修正后kv文件
将原calc.kv重命名为calculator.kv(和应用类名小写匹配,kivy自动加载,无需手动调用load_file),内容如下:
#:kivy 2.0.0 <WindowManager>: Screen1 <Screen1>: BoxLayout: orientation:"vertical" size: root.width, root.height TextInput: id: calc_input text: "0" halign: "right" font_size : 65 size_hint: (1, .15) GridLayout: cols:4 rows:5 Button: size_hint: (.2, .2) font_size: 32 text: "<<<" on_press : root.remove() Button: id: clear size_hint: (.2, .2) font_size: 32 text: "C" on_press : root.clear() Button: size_hint: (.2, .2) font_size: 32 text: "/" on_press : root.math_sign("/") Button: size_hint: (.2, .2) font_size: 32 text: "7" on_press : root.button_press(7) Button: size_hint: (.2, .2) font_size: 32 text: "8" on_press : root.button_press(8) Button: size_hint: (.2, .2) font_size: 32 text: "9" on_press : root.button_press(9) Button: size_hint: (.2, .2) font_size: 32 text: "x" on_press : root.math_sign("*") Button: size_hint: (.2, .2) font_size: 32 text: "4" on_press : root.button_press(4) Button: size_hint: (.2, .2) font_size: 32 text: "5" on_press : root.button_press(5) Button: size_hint: (.2, .2) font_size: 32 text: "6" on_press : root.button_press(6) Button: size_hint: (.2, .2) font_size: 32 text: "-" on_press : root.math_sign("-") Button: size_hint: (.2, .2) font_size: 32 text: "1" on_press : root.button_press(1) Button: size_hint: (.2, .2) font_size: 32 text: "2" on_press : root.button_press(2) Button: size_hint: (.2, .2) font_size: 32 text: "3" on_press : root.button_press(3) Button: size_hint: (.2, .2) font_size: 32 text: "+" on_press : root.math_sign("+") Button: size_hint: (.2, .2) font_size: 32 text: "0" on_press : root.button_press(0) Button: size_hint: (.2, .2) font_size: 32 text: "." on_press : root.dot() Button: size_hint: (.2, .2) font_size: 32 text: "=" on_press :root.equals()
打包方案
方案1:打包为Windows端独立exe(完全原生,无需虚拟机)
使用PyInstaller直接在Windows10环境下打包,步骤如下:
- 打开cmd,安装所需依赖:
pip install pyinstaller kivy.deps.sdl2 kivy.deps.glew - 进入项目文件夹(calculator.py和calculator.kv存放目录),执行打包命令:
pyinstaller --onefile --windowed --add-data "calculator.kv;." calculator.py - 打包完成后,可独立运行的exe文件存放在生成的
dist文件夹内,无需依赖Python环境即可直接运行。
方案2:打包为安卓APK(Windows下无需虚拟机,修正Colab打包逻辑)
你此前Colab打包闪退就是因为代码没有修正,按以下步骤调整即可:
- 用上面修正后的代码上传到Colab
- 生成buildozer.spec配置文件后,修改以下配置项:
source.include_exts = py,png,jpg,kv,atlas确保kv文件被打包进资源android.api = 33选择兼容性较好的安卓API版本android.apptheme = @android:style/Theme.NoTitleBar避免主题兼容问题
- 重新运行打包命令,生成的APK即可正常安装运行。
内容的提问来源于stack exchange,提问作者Akshit Singh
相关产品推荐
相关产品推荐

