tkinter绘制组件(48)——日期与时间滚动选择器
tkinter绘制组件48——日期与时间滚动选择器引言多种格式选项文本居中选中项居中选中指定初始指定手动指定效果github项目pip下载引言TinUI的日期与时间选择器非原版TinUI功能控件需安装tinuipicker库pip install tinuipicker项目地址Smart-Space/TinUIPicker: TinUI高级滚动选择器。在用AI为TinUI写日期滚动选值框-CSDN博客一文中讲解了日期滚动选择器本文不再赘述而是以另一个控件——时间选择器——讲解新的picker相较于原版picker的改进细节。多种格式tinuipicker的时间选择器允许12小时和24小时默认制同时可以指定是否让秒可选。以上格式通过初始化参数指定classTinUITimePicker:def__init__(self,tinui,pos,font(微软雅黑,10),is_24hTrue,show_secTrue,nowdatetime.now(),commandNone,anchornw,**kwargs):# ...ifself.is_24h:self.res_hourstr(now.hour).zfill(2)self.res_ampmelse:hnow.hour self.res_ampmAMifh12elsePMh12h%12self.res_hourstr(12ifh120elseh12).zfill(2)# ...对应到视图元素则在_setup_picker_ui中确定选择器的数量和尺寸。def_setup_picker_ui(self):初始化 Toplevel 弹出层及其内部选择列# 根据制式动态计算宽度col_widths[50,60,60,60]ifnotself.is_24helse[60,60,60]ifnotself.show_sec:col_widths.pop()widthsum(col_widths)(len(col_widths)*3)12height260# ...选项文本居中TinUI原版picker中选项均为左对齐在这里改为居中显示def_loaddata(self,box,items,mw,col_type):填充列数据并绑定滚动与点击box.delete(all)box.choices{}y_ptr5foriinitems:text_idbox.create_text((mw/2,y_ptr2),texti,fillself.cfg[fg],fontself.font,anchorn)# ...# ...选中项居中TinUI原版picker中不具有该功能。在日期和时间选择器中会将当前选择项不一定已经确认尽可能放在选择器中间。具体实现就是判断当前选项中心和视图中心的单位差再除以总可滚动区域的高度就可以得到纵向视图的位置要求0~1。defshow(self,event):动画显示弹出框# 选中项居中foriinrange(len(self.pickerbars)):bboxself.pickerbars[i].bbox(self.sel_backs[i])centery(bbox[1]bbox[3])/2view_centeryself.pickerbars[i].winfo_height()/2scroll_regionself.pickerbars[i].cget(scrollregion).split()scroll_y1,scroll_y2int(scroll_region[1]),int(scroll_region[3])total_heightscroll_y2-scroll_y1 self.pickerbars[i].yview_moveto((centery-view_centery)/total_height)# ...self.sel_backs记录了当前被选择项目的背景元素。选中指定初始指定初始化通过now参数指定的时间会以如下方式绑定到后端数据# 小时初始化代码已在上文提及data_sets.append([str(m).zfill(2)forminrange(0,60)])# 分ifself.show_sec:data_sets.append([str(s).zfill(2)forsinrange(0,60)])# 秒在_loaddata会判定当前选项文本是否被选中def_loaddata(self,box,items,mw,col_type):填充列数据并绑定滚动与点击box.delete(all)box.choices{}y_ptr5foriinitems:#...is_sel(ibox.newres)ifis_sel:self.sel_backs.append(back_id)box.itemconfig(back_id,fillself.cfg[onbg])box.itemconfig(text_id,fillself.cfg[onfg])#...# ...手动指定TinUITimePicker提供set_time方法用于指定选中时间defset_time(self,hour:intNone,minute:intNone,second:intNone):base_index0ifself.is_24helse1ifhourisnotNone:ifnotself.is_24h:ifhour12:hour-12_,t,_,_next(islice(self.pickerbars[0].choices.values(),1,2))else:_,t,_,_next(islice(self.pickerbars[0].choices.values(),0,1))self._pick_sel_it(self.pickerbars[0],t,0)_,t,_,_next(islice(self.pickerbars[base_index].choices.values(),hour-1,hour))self._pick_sel_it(self.pickerbars[base_index],t,base_index)ifminuteisnotNone:indexminute _,t,_,_next(islice(self.pickerbars[base_index1].choices.values(),index,index1))self._pick_sel_it(self.pickerbars[base_index1],t,base_index1)ifsecondisnotNoneandself.show_sec:indexsecond _,t,_,_next(islice(self.pickerbars[base_index2].choices.values(),index,index1))self._pick_sel_it(self.pickerbars[base_index2],t,base_index2)self._confirm()每个选项均各自选中后调用_confirm进行确定避免功能完全相同的代码的重复。另外要注意的是这里的分钟和秒的执行判断为is not None因为0分、0秒是可选的。效果github项目TinUI的github项目地址pip下载pipinstalltinui

相关新闻

小笑授权系统V7.3全开源版支持二开

小笑授权系统V7.3全开源版支持二开

小笑授权系统旨在为个人开发者或者开发团队提供一种高效便捷的管理个人源码的方案。通过小笑多应用授权系统,您可以随时随地的面向您的用户添加授权、管理授权。此外还可以通过简单的配置实现源码的在线下载、用户远程的在线更新、盗版系统的追踪打击。所以说&#…

2026/7/3 6:16:59 阅读更多 →
AI代理记忆综述:从“短期失忆“到统一框架,一文读懂智能体记忆系统设计

AI代理记忆综述:从“短期失忆“到统一框架,一文读懂智能体记忆系统设计

引言 1.论文背景与基础信息 论文《Memory in the Age of AI Agents: A Survey》(arXiv: 2512.13564)于2025年发布,由来自新加坡国立大学、中国人民大学、复旦大学、北京大学、牛津大学等多家顶尖机构的跨学科团队共同撰写。主要核心贡献者包…

2026/7/3 14:43:59 阅读更多 →
保姆级Windows版宝塔面板搭建教程:新手也能轻松上手运维

保姆级Windows版宝塔面板搭建教程:新手也能轻松上手运维

作为一名长期和服务器打交道的开发者,我深知新手配置Windows服务器环境的痛苦——手动安装IIS、PHP、MySQL,光是解决各种依赖冲突和端口占用问题,就能耗掉大半天时间。而宝塔面板的出现,直接把复杂的运维操作变成了"点点点&q…

2026/7/3 14:44:01 阅读更多 →

最新新闻

如何永久冻结IDM试用期?5分钟掌握开源安全激活方案

如何永久冻结IDM试用期?5分钟掌握开源安全激活方案

如何永久冻结IDM试用期?5分钟掌握开源安全激活方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 你是否厌倦了每隔30天就要为IDM试用期倒计时而烦恼…

2026/7/3 22:31:59 阅读更多 →
性能测试工具选型指南:JMeter、k6、Gatling等主流工具深度对比与实战避坑

性能测试工具选型指南:JMeter、k6、Gatling等主流工具深度对比与实战避坑

1. 项目概述:为什么我们需要对比性能测试工具?在软件开发和运维的日常工作中,性能测试是保障系统稳定、可靠、高效运行的关键环节。无论是上线前的压力摸底,还是线上突发流量下的瓶颈定位,一个趁手的性能测试工具就像外…

2026/7/3 22:29:59 阅读更多 →
如何轻松解密DRM加密视频:Video Decrypter完整操作指南

如何轻松解密DRM加密视频:Video Decrypter完整操作指南

如何轻松解密DRM加密视频:Video Decrypter完整操作指南 【免费下载链接】video_decrypter Decrypt video from a streaming site with MPEG-DASH Widevine DRM encryption. 项目地址: https://gitcode.com/gh_mirrors/vi/video_decrypter 还在为无法保存喜欢…

2026/7/3 22:23:58 阅读更多 →
Text-to-CAD UI终极指南:如何用一句话生成专业3D模型

Text-to-CAD UI终极指南:如何用一句话生成专业3D模型

Text-to-CAD UI终极指南:如何用一句话生成专业3D模型 【免费下载链接】text-to-cad-ui A lightweight UI for interacting with the Zoo Text-to-CAD API. 项目地址: https://gitcode.com/gh_mirrors/te/text-to-cad-ui 你是否曾经因为不会使用复杂的CAD软件…

2026/7/3 22:23:58 阅读更多 →
深入pytest_collection_modifyitems钩子:定制化测试用例执行与调度

深入pytest_collection_modifyitems钩子:定制化测试用例执行与调度

1. 项目概述如果你在用pytest做自动化测试,尤其是项目规模稍微大一点,或者对测试报告、用例执行顺序有特殊要求时,你大概率会碰到一个绕不开的“神器”——pytest_collection_modifyitems钩子函数。我第一次深入使用它,是因为一个…

2026/7/3 22:17:57 阅读更多 →
DVWA从入门到精通(八):SQL Injection(SQL注入)

DVWA从入门到精通(八):SQL Injection(SQL注入)

摘要:本文是《DVWA从入门到精通》系列的第八篇,带你全面掌握SQL Injection(SQL注入)模块的攻防全流程。从SQL注入的核心原理出发,逐步讲解Low、Medium、High三个级别的攻击手法与源码分析,并深入探讨Imposs…

2026/7/3 22:17:57 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻