指南:基于 date_and_time 示例解析 DateInput 與 TimeInput)
跨平臺UI組件桌面應(yīng)用【免費下載鏈接】togaA Python native, OS native GUI toolkit.項目地址https://gitcode.com/gh_mirrors/to/toga點擊查看免費下載導(dǎo)讀本文以 Toga 官方示例 examples/date_and_time 為藍本系統(tǒng)講解 Toga 中日期輸入控件DateInput與時間輸入控件TimeInput的完整用法包括參數(shù)語義、min/max邊界約束、value的類型轉(zhuǎn)換與自動裁剪、on_change回調(diào)的掛載方式以及如何在桌面端Windows/macOS與 Android 端一鍵運行。讀完本文你將能夠獨立寫出帶日期/時間范圍限制、實時回調(diào)校驗的表單控件代碼并理解其底層實現(xiàn)原理。1. 示例概覽這個應(yīng)用在演示什么date_and_time是 Toga 倉庫中用于測試日期與時間輸入控件的示例應(yīng)用。它在同一個窗口中展示了 8 行輸入控件覆蓋了兩種控件與三種參數(shù)組合的全部排列控件場景演示要點DateInput無限制Any date默認取當(dāng)天日期DateInput僅設(shè)min限制可選最早日期DateInput僅設(shè)max限制可選最晚日期DateInput同時設(shè)minmax完整區(qū)間約束TimeInput無限制Any time默認取當(dāng)前時間TimeInput僅設(shè)min限制可選最早時間TimeInput僅設(shè)max限制可選最晚時間TimeInput同時設(shè)minmax完整區(qū)間約束示例源碼位于 examples/date_and_time/date_and_time/app.py共約 140 行邏輯非常緊湊每行輸入控件都配有右側(cè)固定寬度的標簽用戶在控件中修改日期/時間時應(yīng)用會實時把當(dāng)前值以格式化文本打印到控制臺。平臺可用性說明官方 README 明確指出日期/時間輸入控件僅在Android、macOS 和 Windows平臺上可用。不過從倉庫源碼結(jié)構(gòu)看gtk、qt、iOS、web等后端也各自提供了dateinput.py/timeinput.py實現(xiàn)見 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 核心包以模塊方式啟動示例。示例包內(nèi) examples/date_and_time/date_and_time/main.py 提供了模塊入口from date_and_time.app import main if __name__ __main__: main().main_loop()main()返回一個DateAndTimeApp實例隨后調(diào)用其main_loop()進入事件循環(huán)。2.2 在 Android 上運行$ python -m pip install briefcase $ briefcase run androidAndroid 端需要借助 Briefcase 工具鏈打包運行。示例的 examples/date_and_time/pyproject.toml 已經(jīng)預(yù)先配置好了 Briefcase 構(gòu)建描述應(yīng)用標識為org.beeware.toga.examples包名date_and_time版本0.0.1許可證 BSD-3-Clause[tool.briefcase.app.date_and_time]段聲明了源碼目錄date_and_time及核心依賴../../travertino、../../core各平臺段分別掛載對應(yīng)后端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 組件實現(xiàn)。3. 控件構(gòu)造一個窗口里的 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的垂直容器中作為主窗口內(nèi)容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 控件的四個核心參數(shù)從接口定義core/src/toga/widgets/dateinput.py、core/src/toga/widgets/timeinput.py可以看出兩個控件的構(gòu)造參數(shù)完全對稱參數(shù)類型默認行為說明idstr \| NoneNone控件唯一標識回調(diào)中可通過widget.id區(qū)分是哪個控件styleStyleT \| None默認樣式可傳入 Pack 樣式對象valuedate/time \| NoneNone時取當(dāng)天/當(dāng)前時間初始顯示值mindate/time \| NoneNone時取全局最小值可選的最早日期/時間含maxdate/time \| NoneNone時取全局最大值可選的最晚日期/時間含on_change回調(diào)函數(shù)None值變化時觸發(fā)另支持通過**kwargs傳入width等樣式屬性其中width150這類額外關(guān)鍵字會直接應(yīng)用到控件的 Pack 樣式中。3.2 回調(diào)拿到變化后的值示例為日期和時間各注冊了一個回調(diào)用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)})回調(diào)簽名統(tǒng)一為handler(widget)Toga 通過 core/src/toga/handlers.py 的wrapped_handler包裝用戶函數(shù)因此回調(diào)只會收到被觸發(fā)的控件對象你可以直接讀取widget.value并借助widget.id判斷是哪個輸入框發(fā)生了變化。運行示例后在任一輸入框修改值終端就會打印類似Min is Friday 02 April 2021或Max time is 10:42:00 AM的信息。4. 邊界約束min / max 的底層行為這是示例中最有實踐價值的部分min與max不僅限制用戶可選范圍還會對value進行自動裁剪clipping。4.1 DateInput 的取值規(guī)則示例展示了四種寫法直接傳date對象、傳 ISO 格式字符串、或留空。其內(nèi)部轉(zhuǎn)換邏輯在 core/src/toga/widgets/dateinput.pyNone→date.today()當(dāng)天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 裁剪的三種聯(lián)動場景設(shè)置value、min、max時存在聯(lián)動裁剪見 dateinput.py 與 timeinput.pyvalue越界設(shè)置value時若小于min則被抬升為min若大于max則被壓低為max調(diào)大min若當(dāng)前value早于新minvalue被裁剪為新min若max早于新minmax也被一并抬升調(diào)小max若當(dāng)前value晚于新maxvalue被裁剪為新max若min晚于新maxmin也被一并壓低。這些行為均有測試覆蓋。例如 core/tests/widgets/test_dateinput.py 的test_value_clipping驗證了2010-01-012020-01-01區(qū)間內(nèi)把value設(shè)為2005-06-12會被裁剪為2010-01-01test_timeinput.py 的test_min_clip則驗證了當(dāng)min抬高越過當(dāng)前value時value會被同步裁剪并觸發(fā)一次on_change。4.3 TimeInput 的特有規(guī)則時間控件的范圍邊界為00:00:00min 默認值到23:59:59max 默認值見 timeinput.py)。它的值轉(zhuǎn)換timeinput.py與日期控件類似但有兩處差異None→datetime.datetime.now().time()當(dāng)前時刻返回前統(tǒng)一replace(microsecond0)微秒永遠歸零。平臺差異提示API 文檔docs/en/reference/api/widgets/timeinput.md注明在 Android 和 iOS 上秒也會歸零且min/max中設(shè)置的秒數(shù)會被忽略——移動端時間選擇器通常只精確到分鐘。另外 docs/en/reference/api/widgets/dateinput.md 提到 iOS 上無法定制日期控件的顏色/背景樣式Apple 未提供相關(guān) API。5. 示例的四種邊界組合寫法直接給出示例中可復(fù)制的完整寫法節(jié)選自 app.py僅設(shè)最小值toga.DateInput( idMin, valueNone, on_changeself.changed_date, min2021-01-01, # ISO 字符串也可直接傳入 )僅設(shè)最大值toga.DateInput( idMax, valuedate(2021, 4, 2), on_changeself.changed_date, maxdate(2022, 2, 1), )同時設(shè)置區(qū)間toga.DateInput( idMin-max, valuedate(2021, 4, 2), on_changeself.changed_date, mindate(2021, 1, 1), maxdate(2022, 2, 1), )時間控件對應(yīng)寫法時/分/秒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. 事件觸發(fā)的時機驗證一個容易被忽略的細節(jié)構(gòu)造時即使傳入了on_change回調(diào)也不會在創(chuàng)建控件時被調(diào)用。核心測試對此有明確斷言test_dateinput.py# The change handler isnt invoked at construction. on_change_handler.assert_not_called()而每次通過屬性賦值改變value時回調(diào)會且只會被調(diào)用一次即使賦值前后值相同。wrapped_handler會在值實際寫入底層實現(xiàn)后觸發(fā)事件測試用例 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. 小結(jié)與擴展建議date_and_time示例雖然只有 140 行卻完整演示了 Toga 日期/時間控件的核心能力value的類型寬容date/time/datetime/ISO 字符串/None、min/max的自動裁剪聯(lián)動、以及on_change回調(diào)的掛載與觸發(fā)時機?;谒憧梢钥焖贁U展出實際業(yè)務(wù)場景例如將回調(diào)中的print替換為表單校驗實時判斷所選日期是否在工作日或未來結(jié)合value的字符串解析能力從后端接口返回的 ISO 字符串直接初始化控件利用widget.id區(qū)分多個輸入框復(fù)用同一個回調(diào)處理一整組日期/時間字段。若需深入了解每個參數(shù)的完整語義可繼續(xù)閱讀官方 API 文檔 DateInput 參考 與 TimeInput 參考想驗證控件在各種邊界條件下的行為可查看核心測試 test_dateinput.py 與 test_timeinput.py。贊分享跨平臺UI組件桌面應(yīng)用【免費下載鏈接】togaA Python native, OS native GUI toolkit.項目地址https://gitcode.com/gh_mirrors/to/toga點擊查看免費下載相關(guān)推薦Toga TimeInput 時間選擇控件屬性、事件與跨平臺實現(xiàn)解析Toga TimeInput 時間選擇控件屬性、事件與跨平臺實現(xiàn)解析 TimeInput 是 Toga 中用于讓用戶選擇一天中某一時刻時、分、秒的本地化原跨平臺UI組件桌面應(yīng)用Toga DateInput 日期選擇控件從基礎(chǔ)用法到跨平臺實現(xiàn)原理Toga DateInput 日期選擇控件從基礎(chǔ)用法到跨平臺實現(xiàn)原理 本文是 TogaA Python native, OS native GUI tool跨平臺UI組件桌面應(yīng)用ESP32 溫控 PID 閉環(huán)實戰(zhàn)從原始 ADC 讀數(shù)到穩(wěn)定的加熱功率輸出ESP32 溫控 PID 閉環(huán)實戰(zhàn)從原始 ADC 讀數(shù)到穩(wěn)定的加熱功率輸出 設(shè)溫 25°C實際沖到 31°C 才慢慢回落到 24°C——這是第一次跑溫控閉環(huán)嵌入式物聯(lián)網(wǎng)驅(qū)動開發(fā)上一篇網(wǎng)絡(luò)設(shè)備權(quán)限解鎖全攻略三步開啟永久管理通道下一篇ESP芯片燒錄終極指南如何用esptool.py輕松搞定固件編程創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考