你有没有遇到过这种尴尬情况:用Python写了个小工具,在自己电脑上跑得好好的,结果同事Mac一打开,界面直接崩了?或者老板说“能不能搞个手机版”?你心里一万个不乐意——又要重写一遍?
我以前就老被这事儿折磨。直到我翻到了Toga这个项目。
这事儿到底有多烦人?
说实话,Python做桌面GUI,选择真不多。Tkinter吧,那界面丑得跟上世纪90年代似的,控件少得可怜。PyQt倒是功能强,但它不是原生界面啊,在Mac上看着像Windows程序,在Windows上又像Linux移植过来的。更别提什么PySide、wxPython了,每个都得重新学一套API。
最要命的是——你想做个手机App?对不起,上面这些全部不行,你得去学Kivy或者干脆转Java、Swift。一套代码想跑多端?梦里啥都有。

Toga是怎么解决这个问题的?
Toga这玩意儿思路很清奇。它不自己去画界面,而是调用系统原生的控件——在Mac上它用Cocoa,在Windows上用WinForms,在Linux上用GTK,在手机上用原生API。
什么意思呢?就是你写的Python代码是统一的,但Toga在背后帮你翻译成各个平台“听得懂”的话。比如你写个按钮,在Mac上它就是个真正的Mac风格按钮,在手机上就是Android/iOS原生按钮。用户根本看不出来这是Python写的。
而且这货连网页和终端都支持!你用同一套代码,居然能在浏览器里跑,或者在命令行里显示一个伪GUI界面——虽然简陋点,但调试或者远程连接的时候真能救命。
上手有多简单?
这么说吧,你要是会Python基础,十分钟就能跑起来。
import toga
from toga.style import Pack
from toga.style.pack import COLUMN
defbuild(app):
box = toga.Box(style=Pack(direction=COLUMN))
button = toga.Button(
'点我呀',
on_press=lambda w: print('被点了'),
style=Pack(padding=5)
)
box.add(button)
return box
app = toga.App('我的第一个应用', 'com.example.first', startup=build)
app.main_loop()
这代码在哪个平台跑都一样。你不需要知道Mac的NSButton怎么用,也不用管Android的Button是什么鬼。
想看看完整效果?一行命令就能跑demo:
pip install toga-demo
toga-demo
会弹出一个窗口,里面各种控件都演示了一遍。
真的有那么完美吗?
哎,我得说句实在话——不完美。
首先,它目前还有一些控件没实现,比如高级的表格视图、树形控件,得自己想办法或者等更新。其次,打包出来的应用体积不算小,毕竟要带Python解释器和各平台的后端。还有就是国内用的人还不多,遇到问题中文资料少,得去GitHub讨论或者Discord问。
不过好消息是,这项目是BeeWare套件的一部分,背后有Anaconda赞助,社区还算活跃。我上次提了个issue,两天就有人回复了。
什么时候该用它?
我给你捋一捋:
最后说两句
这个项目的理念我特别喜欢——写一次,到处原生运行,而不是像Electron那样包个浏览器内核。虽然现在还年轻,但方向是对的。
你要是有兴趣,可以去他们的Git仓库看看代码,文档写得还算清楚。反正是开源的,BSL许可证,随便用。
项目地址: https://github.com/beeware/toga