跨平台UI组件桌面应用【免费下载链接】togaA Python native, OS native GUI toolkit.项目地址https://gitcode.com/gh_mirrors/to/toga点击查看免费下载导读本文以 Toga 官方示例 examples/date_and_time 为蓝本系统讲解 Toga 中日期输入控件DateInput与时间输入控件TimeInput的完整用法包括参数语义、min/max边界约束、value的类型转换与自动裁剪、on_change回调的挂载方式以及如何在桌面端Windows/macOS与 Android 端一键运行。读完本文你将能够独立写出带日期/时间范围限制、实时回调校验的表单控件代码并理解其底层实现原理。1. 示例概览这个应用在演示什么date_and_time是 Toga 仓库中用于测试日期与时间输入控件的示例应用。它在同一个窗口中展示了 8 行输入控件覆盖了两种控件与三种参数组合的全部排列控件场景演示要点DateInput无限制Any date默认取当天日期DateInput仅设min限制可选最早日期DateInput仅设max限制可选最晚日期DateInput同时设minmax完整区间约束TimeInput无限制Any time默认取当前时间TimeInput仅设min限制可选最早时间TimeInput仅设max限制可选最晚时间TimeInput同时设minmax完整区间约束示例源码位于 examples/date_and_time/date_and_time/app.py共约 140 行逻辑非常紧凑每行输入控件都配有右侧固定宽度的标签用户在控件中修改日期/时间时应用会实时把当前值以格式化文本打印到控制台。平台可用性说明官方 README 明确指出日期/时间输入控件仅在Android、macOS 和 Windows平台上可用。不过从仓库源码结构看gtk、qt、iOS、web等后端也各自提供了dateinput.py/timeinput.py实现见 gtk/src/toga_gtk/widgets/dateinput.py、qt/src/toga_qt/widgets/timeinput.py 等具体能力以各平台文档为准。2. 快速上手从克隆到运行官方 README 给出了两种启动方式下面逐一展开。2.1 在 Windows / macOS 桌面端运行$ python -m pip install toga $ python -m date_and_time两条命令分别完成安装 Toga 核心包以模块方式启动示例。示例包内 examples/date_and_time/date_and_time/main.py 提供了模块入口from date_and_time.app import main if __name__ __main__: main().main_loop()main()返回一个DateAndTimeApp实例随后调用其main_loop()进入事件循环。2.2 在 Android 上运行$ python -m pip install briefcase $ briefcase run androidAndroid 端需要借助 Briefcase 工具链打包运行。示例的 examples/date_and_time/pyproject.toml 已经预先配置好了 Briefcase 构建描述应用标识为org.beeware.toga.examples包名date_and_time版本0.0.1许可证 BSD-3-Clause[tool.briefcase.app.date_and_time]段声明了源码目录date_and_time及核心依赖../../travertino、../../core各平台段分别挂载对应后端macOS 用cocoa、Linux 用gtk、Windows 用winforms、iOS 用iOS、Android 用android、Web 用webAndroid 段额外指定了 Material 主题Theme.MaterialComponents.Light.DarkActionBar和com.google.android.material:material:1.12.0依赖说明 Android 上的日期/时间控件基于 Material 组件实现。3. 控件构造一个窗口里的 8 行输入示例的startup()方法用toga.Box组合所有控件。以日期行为例每个输入控件与一个宽度 150px、右对齐的标签排成一行any_date_box toga.Box( children[ toga.Label(Any date:, width150, text_alignRIGHT), toga.DateInput( idAny, valueNone, on_changeself.changed_date, ), ], directionROW, )随后将所有行放入directionCOLUMN的垂直容器中作为主窗口内容self.main_window.content toga.Box( children[ any_date_box, min_date_box, max_date_box, min_max_date_box, any_time_box, min_time_box, max_time_box, min_max_time_box, ], directionCOLUMN, ) self.main_window.show()3.1 控件的四个核心参数从接口定义core/src/toga/widgets/dateinput.py、core/src/toga/widgets/timeinput.py可以看出两个控件的构造参数完全对称参数类型默认行为说明idstr \| NoneNone控件唯一标识回调中可通过widget.id区分是哪个控件styleStyleT \| None默认样式可传入 Pack 样式对象valuedate/time \| NoneNone时取当天/当前时间初始显示值mindate/time \| NoneNone时取全局最小值可选的最早日期/时间含maxdate/time \| NoneNone时取全局最大值可选的最晚日期/时间含on_change回调函数None值变化时触发另支持通过**kwargs传入width等样式属性其中width150这类额外关键字会直接应用到控件的 Pack 样式中。3.2 回调拿到变化后的值示例为日期和时间各注册了一个回调用strftime做本地化格式化输出def changed_date(self, widget): print(f{widget.id} is {widget.value.strftime(%A %d %B %Y)}) def changed_time(self, widget): print(f{widget.id} is {widget.value.strftime(%I:%M:%S %p)})回调签名统一为handler(widget)Toga 通过 core/src/toga/handlers.py 的wrapped_handler包装用户函数因此回调只会收到被触发的控件对象你可以直接读取widget.value并借助widget.id判断是哪个输入框发生了变化。运行示例后在任一输入框修改值终端就会打印类似Min is Friday 02 April 2021或Max time is 10:42:00 AM的信息。4. 边界约束min / max 的底层行为这是示例中最有实践价值的部分min与max不仅限制用户可选范围还会对value进行自动裁剪clipping。4.1 DateInput 的取值规则示例展示了四种写法直接传date对象、传 ISO 格式字符串、或留空。其内部转换逻辑在 core/src/toga/widgets/dateinput.pyNone→date.today()当天datetime.datetime→ 提取.date()部分str→datetime.date.fromisoformat()解析如2021-01-01其他类型 → 抛TypeError(Not a valid date value)。同时模块顶部定义了全局支持范围dateinput.pyMIN_DATE datetime.date(1800, 1, 1) MAX_DATE datetime.date(8999, 12, 31)min未指定时默认为1800-01-01max未指定时默认为8999-12-31含min/max超出该范围会抛ValueError如 The lowest supported date is 1800-01-01但value超出范围不会报错而是被裁剪到最近的合法边界。4.2 裁剪的三种联动场景设置value、min、max时存在联动裁剪见 dateinput.py 与 timeinput.pyvalue越界设置value时若小于min则被抬升为min若大于max则被压低为max调大min若当前value早于新minvalue被裁剪为新min若max早于新minmax也被一并抬升调小max若当前value晚于新maxvalue被裁剪为新max若min晚于新maxmin也被一并压低。这些行为均有测试覆盖。例如 core/tests/widgets/test_dateinput.py 的test_value_clipping验证了2010-01-012020-01-01区间内把value设为2005-06-12会被裁剪为2010-01-01test_timeinput.py 的test_min_clip则验证了当min抬高越过当前value时value会被同步裁剪并触发一次on_change。4.3 TimeInput 的特有规则时间控件的范围边界为00:00:00min 默认值到23:59:59max 默认值见 timeinput.py)。它的值转换timeinput.py与日期控件类似但有两处差异None→datetime.datetime.now().time()当前时刻返回前统一replace(microsecond0)微秒永远归零。平台差异提示API 文档docs/en/reference/api/widgets/timeinput.md注明在 Android 和 iOS 上秒也会归零且min/max中设置的秒数会被忽略——移动端时间选择器通常只精确到分钟。另外 docs/en/reference/api/widgets/dateinput.md 提到 iOS 上无法定制日期控件的颜色/背景样式Apple 未提供相关 API。5. 示例的四种边界组合写法直接给出示例中可复制的完整写法节选自 app.py仅设最小值toga.DateInput( idMin, valueNone, on_changeself.changed_date, min2021-01-01, # ISO 字符串也可直接传入 )仅设最大值toga.DateInput( idMax, valuedate(2021, 4, 2), on_changeself.changed_date, maxdate(2022, 2, 1), )同时设置区间toga.DateInput( idMin-max, valuedate(2021, 4, 2), on_changeself.changed_date, mindate(2021, 1, 1), maxdate(2022, 2, 1), )时间控件对应写法时/分/秒toga.TimeInput( idMin-max time, valuetime(10, 42), on_changeself.changed_time, mintime(8, 15), maxtime(21, 30), )注意示例中min使用了字符串06:35:00、max使用了time对象两种形式等价valuetime(10, 42)表示10:42:00缺失的秒自动补零。6. 事件触发的时机验证一个容易被忽略的细节构造时即使传入了on_change回调也不会在创建控件时被调用。核心测试对此有明确断言test_dateinput.py# The change handler isnt invoked at construction. on_change_handler.assert_not_called()而每次通过属性赋值改变value时回调会且只会被调用一次即使赋值前后值相同。wrapped_handler会在值实际写入底层实现后触发事件测试用例 test_value 中assert_called_once_with(widget)即验证了这一点。非法值则会在赋值阶段直接抛出异常测试覆盖了两类情况test_dateinput.py非法输入异常类型消息123、object()、time对象TypeErrorNot a valid date valuenot a dateValueErrorInvalid isoformat string: not a date7. 小结与扩展建议date_and_time示例虽然只有 140 行却完整演示了 Toga 日期/时间控件的核心能力value的类型宽容date/time/datetime/ISO 字符串/None、min/max的自动裁剪联动、以及on_change回调的挂载与触发时机。基于它你可以快速扩展出实际业务场景例如将回调中的print替换为表单校验实时判断所选日期是否在工作日或未来结合value的字符串解析能力从后端接口返回的 ISO 字符串直接初始化控件利用widget.id区分多个输入框复用同一个回调处理一整组日期/时间字段。若需深入了解每个参数的完整语义可继续阅读官方 API 文档 DateInput 参考 与 TimeInput 参考想验证控件在各种边界条件下的行为可查看核心测试 test_dateinput.py 与 test_timeinput.py。赞分享跨平台UI组件桌面应用【免费下载链接】togaA Python native, OS native GUI toolkit.项目地址https://gitcode.com/gh_mirrors/to/toga点击查看免费下载相关推荐Toga TimeInput 时间选择控件属性、事件与跨平台实现解析Toga TimeInput 时间选择控件属性、事件与跨平台实现解析 TimeInput 是 Toga 中用于让用户选择一天中某一时刻时、分、秒的本地化原跨平台UI组件桌面应用Toga DateInput 日期选择控件从基础用法到跨平台实现原理Toga DateInput 日期选择控件从基础用法到跨平台实现原理 本文是 TogaA Python native, OS native GUI tool跨平台UI组件桌面应用ESP32 温控 PID 闭环实战从原始 ADC 读数到稳定的加热功率输出ESP32 温控 PID 闭环实战从原始 ADC 读数到稳定的加热功率输出 设温 25°C实际冲到 31°C 才慢慢回落到 24°C——这是第一次跑温控闭环嵌入式物联网驱动开发上一篇网络设备权限解锁全攻略三步开启永久管理通道下一篇ESP芯片烧录终极指南如何用esptool.py轻松搞定固件编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考