写了这么多年 Python,你是不是也想过:要是能一套代码跑在 Windows、macOS 甚至手机上,该多爽?
Toga 就是奔着这个目标来的——它是 BeeWare 家族的核心成员,号称“写一次,跑遍所有平台”,而且用的是系统原生控件,不是那种一看就是网页套壳的界面 。
🚀 起手式:5 行代码跑起你的第一个窗口
咱们先来个最精简的版本,感受一下它的“轻”。
import toga
defbuild(app):
# 创建一个盒子,用来装东西
box = toga.Box()
# 往盒子里加个标签
label = toga.Label('你好,Toga!')
box.add(label)
return box
# 启动应用
if __name__ == '__main__':
app = toga.App('FirstApp', 'org.example.firstapp', startup=build)
app.main_loop()
运行这段代码,一个原生风格的窗口就会弹出来,标题是你起的“FirstApp”,中间端端正正摆着“你好,Toga!”。
这里没有乱七八糟的依赖,干净利落 。
🖱️ 给世界一个回应:按钮和点击事件
光有标签太无聊了,得让用户能和程序互动。
Toga 里给按钮绑定事件,就像给门装上把手一样自然。
defbutton_handler(widget):
# 点击按钮后,控制台会打印这句话
print("按钮被点了一下,有反应!")
# 也可以顺手改改按钮的文字
widget.text = "已点击"
defbuild(app):
box = toga.Box()
# 创建按钮,把事件处理函数挂上去
btn = toga.Button('点我试试', on_press=button_handler)
# 稍微加点内边距,让它别那么挤
btn.style.padding = 20
box.add(btn)
return box
# ... 启动代码同上
点一下按钮,控制台立刻输出“按钮被点了一下,有反应!”,同时按钮的文字也变成了“已点击”。
这种所见即所得的反馈,写起来很符合直觉 。
📦 装点东西:来个简单的输入框和布局
一个正经的应用总得让用户输点啥。
Toga 的布局有点像搭积木,用 Box 一层层套,用 style 调位置。
defbuild(app):
# 创建一个垂直排列的主盒子
main_box = toga.Box(style=toga.style.pack.Pack(direction='column'))
# 加个提示标签
lbl = toga.Label('你的名字:')
# 加个输入框
input_field = toga.TextInput(placeholder='例如:张三')
# 再做一个按钮,点击后获取输入框的内容
defgreet_handler(widget):
print(f"你好,{input_field.value}!")
greet_btn = toga.Button('打招呼', on_press=greet_handler)
# 把所有组件按顺序装进主盒子
main_box.add(lbl)
main_box.add(input_field)
main_box.add(greet_btn)
return main_box
输入框里填上名字,点一下按钮,控制台就会热情地跟你打招呼。
🆚 Toga 和其他 Python GUI 框架怎么选?
Python 的 GUI 方案不少,Tkinter 是“随叫随到”的老伙计,PyQt 是功能强大的重型武器,Kivy 则是多点触控的创意派 。
Toga 的核心优势在于 “原生”和“统一”。
它不像 Kivy 那样自己画控件,而是调用 Windows、macOS 各自的 API 来生成按钮和菜单,所以应用看起来和系统融为一体 。
建议:如果你想快速做一个工具类应用,希望它能在各个系统上都“长得像本地人”,并且愿意拥抱这一套新兴的生态,Toga 值得一试。
如果项目极其复杂,或者需要特别冷门的控件,PyQt 可能更稳妥。
📝 最后的话
从第一个弹窗,到能响应用户输入,再到切换页面,Toga 给我的感觉是——它确实在努力让 Python 的跨平台开发变得更“体面”。
你有没有想过用 Python 做个什么小工具?
或者已经在用其他 GUI 框架?欢迎来评论区聊聊你的想法和遇到的坑~