Python中如何实现跨平台桌面应用,且无需在目标平台安装Python库?
用 python 做桌面应用,想实现在 windows 下就是一个 exe,点击就可以运行 UI 界面。在 mac 下就是一个 app 同样点击就可以运行。不要求对应平台安装 python 库。python 新手,求教。
Python中如何实现跨平台桌面应用,且无需在目标平台安装Python库?
eletrcon
用PyInstaller打包成独立可执行文件就行,一个命令搞定。
# 1. 先写你的桌面应用代码,比如用tkinter
import tkinter as tk
def main():
root = tk.Tk()
root.title("跨平台桌面应用")
label = tk.Label(root, text="Hello, 打包成功!")
label.pack(padx=20, pady=20)
root.mainloop()
if __name__ == "__main__":
main()
# 2. 安装PyInstaller
pip install pyinstaller
# 3. 打包成单文件可执行程序(Windows/Linux/macOS都支持)
pyinstaller --onefile --windowed your_script.py
--onefile生成单个exe/app文件,--windowed隐藏命令行窗口。打包后dist/目录下的可执行文件可以直接发给别人用,不需要装Python或任何库。
注意:如果用了特殊库(如PyQt、OpenCV),可能需要手动处理依赖。建议在干净虚拟环境里打包,避免把开发环境的冗余依赖打进去。
一句话:用PyInstaller打包成单文件exe,跨平台分发最省事。
qt
delphi
Delphi 调用 python 方便吗
LZ 的意思应该是不用重新安装 Python 环境吧?
开发机上选一种 GUI 包安装,开发好,然后用 PyIstaller 打包成一个 exe。然后就可以拿着这一个 exe 到处跑了
现在必然是 Electorn
最近我在写一个自用小工具时用了 embed python 的方案,C++端用了[pybind11]( https://github.com/pybind/pybind11) 和 wxWidgets,pybind11 好处是用模板元编程封装好了 python C API 调用,很适合面向对象。[项目地址在这]( https://github.com/czastack/wxFEFactory) ,希望对 LZ 有帮助,还没时间把 GUI 部分单独抽取出来,也没写文档,有 C++基础的话直接看看源码。这个项目还在开发中,也只在 VS 下测试过,可能有些内存泄漏的问题,但可以提供个思路,PS: 很多想法有参考 Sublime Text。
编译后 C++是主体,在里面初始化好 python 环境,再调用一个外部 python 文件作为入口。python 可以用 dll 方式链接,像 sublime text 那样,也可以静态链接到主程序里。用这个方案的原因是 Electorn, qt 这样方案对我来说略大,pyqt, wxPython 同理,且之前我用 wxPython Phoenix 的 wxPropertyGrid 有 crash 的情况,最后决定自己折腾,用 C++封装,release 编译后全部内容能控制在 6M 左右。其中还仿照 RN 的写法,用字典存放样式,现在只实现了几个简单的样式。
python 中调用类似这样python<br>class MainFrame:<br> def __init__(self):<br> self.render()<br> if hasattr(app, 'project'):<br> self.onOpenProject(app.project)<br><br> def render(self):<br> with ui.MenuBar() as menubar:<br> with ui.Menu("文件"):<br> with ui.Menu("新建"):<br> ui.MenuItem("新建工程\tCtrl+Shift+N", onselect=self.newProject)<br> ui.MenuItem("退出\tCtrl+Q", onselect=self.closeWindow)<br> with ui.Menu("视图"):<br> ui.MenuItem("切换控制台\tCtrl+`", onselect=self.toggleConsole)<br><br> with ui.Window("火纹工厂", style=winstyle, styles=styles, menuBar=menubar) as win:<br> with ui.AuiManager(key="aui"):<br> ui.AuiItem(ui.ToolBar().addTool("123", "1234", "", self.onselect).realize(), direction="top", captionVisible=False)<br> ui.AuiItem(ui.ListBox(options=modules, values=lambda x: x, onselect=self.onNav), captionVisible=False)<br> ui.AuiItem(ui.AuiNotebook(key="book"), direction="center", maximizeButton=True, captionVisible=False)<br><br><br>winstyle = {<br> 'width': 1200,<br> 'height': 960,<br>}<br><br>styles = {<br> 'type': {<br><br> },<br> 'class': {<br> 'fill': {'flex': 1},<br> 'expand': {'expand': True},<br> 'console-input': {<br> 'expand': True,<br> 'flex': 1,<br> },<br> 'console-input-multi': {'height': 70},<br> 'btn-sm': {'width': 30,}<br> }<br>}<br>
效果如下

flash
打包行了
轻量级还是用 qt 吧,毕竟 “electron is flash for the desktop”.
用 pyqt 开发,然后用 pyinstaller 打包成单文件、免安装.exe 可执行文件,,除了体积比较大、启动速度不如.py 直接运行外其他都挺好
补充下,PyIstaller 也可以同一份代码打成 exe, linux 的 elf, mac 的格式等

