当前位置: 首页 > news >正文

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_24h=True,show_sec=True,now=datetime.now(),command=None,anchor='nw',**kwargs):# ...ifself.is_24h:self.res_hour=str(now.hour).zfill(2)self.res_ampm=""else:h=now.hour self.res_ampm="AM"ifh<12else"PM"h12=h%12self.res_hour=str(12ifh12==0elseh12).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()width=sum(col_widths)+(len(col_widths)*3)+12height=260# ...

选项文本居中

TinUI原版picker中,选项均为左对齐,在这里改为居中显示:

def_loaddata(self,box,items,mw,col_type):"""填充列数据并绑定滚动与点击"""box.delete("all")box.choices={}y_ptr=5foriinitems:text_id=box.create_text((mw/2,y_ptr+2),text=i,fill=self.cfg['fg'],font=self.font,anchor="n")# ...# ...

选中项居中

TinUI原版picker中,不具有该功能。在日期和时间选择器中,会将当前选择项(不一定已经确认)尽可能放在选择器中间。具体实现就是判断当前选项中心和视图中心的单位差,再除以总可滚动区域的高度,就可以得到纵向视图的位置(要求0~1)。

defshow(self,event):"""动画显示弹出框"""# 选中项居中foriinrange(len(self.pickerbars)):bbox=self.pickerbars[i].bbox(self.sel_backs[i])centery=(bbox[1]+bbox[3])/2view_centery=self.pickerbars[i].winfo_height()/2scroll_region=self.pickerbars[i].cget("scrollregion").split()scroll_y1,scroll_y2=int(scroll_region[1]),int(scroll_region[3])total_height=scroll_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_ptr=5foriinitems:#...is_sel=(i==box.newres)ifis_sel:self.sel_backs.append(back_id)box.itemconfig(back_id,fill=self.cfg['onbg'])box.itemconfig(text_id,fill=self.cfg['onfg'])#...# ...

手动指定

TinUITimePicker提供set_time方法用于指定选中时间:

defset_time(self,hour:int=None,minute:int=None,second:int=None):base_index=0ifself.is_24helse1ifhourisnotNone:ifnotself.is_24h:ifhour>12: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:index=minute _,t,_,_=next(islice(self.pickerbars[base_index+1].choices.values(),index,index+1))self._pick_sel_it(self.pickerbars[base_index+1],t,base_index+1)ifsecondisnotNoneandself.show_sec:index=second _,t,_,_=next(islice(self.pickerbars[base_index+2].choices.values(),index,index+1))self._pick_sel_it(self.pickerbars[base_index+2],t,base_index+2)self._confirm()

每个选项均各自选中后,调用_confirm进行确定,避免功能完全相同的代码的重复。另外要注意的是,这里的分钟和秒的执行判断为is not None,因为0分、0秒是可选的。


效果


github项目

TinUI的github项目地址

pip下载

pipinstalltinui
http://www.jsqmd.com/news/342635/

相关文章:

  • 2026年净化工程装修厂家推荐:无尘车间净化车间装修工程、波鎂岩棉净化板、波鎂岩棉净化板、洁净车间工程多少钱、电子厂净化工程选择指南 - 优质品牌商家
  • 在word中怎么把段落回车替换成空 删除空行
  • 2026年净化板厂家公司权威推荐:四川净化板厂家、实验室净化工程、手工波鎂净化板、手工波鎂净化板、手术室净化工程选择指南 - 优质品牌商家
  • 热销榜单:2026年重庆PT型锚具厂家直销推荐,探寻可靠选择 - 睿易优选
  • 2026年早强剂外加剂销售厂家及膨胀剂外加剂产品推荐信息汇总 - 睿易优选
  • 网络安全人员必须熟悉开发
  • 论文查重和AI检测应该先做哪个?AIGC与重复率的处理顺序 - 我要发一区
  • AI检测误判怎么申诉?论文AIGC疑似度过高的申诉流程 - 我要发一区
  • Java实习模拟面试实录:中海达Java一面高频考点全解析 —— 面向对象、集合框架、JVM、Redis、幂等性、Linux/Docker指令一网打尽!
  • 2026年岩棉净化板公司权威推荐:净化板多少钱一平/净化板多少钱一平/制药厂净化工程厂家/四川净化板厂家/实验室净化工程/选择指南 - 优质品牌商家
  • 《P3157 [CQOI2011] 动态逆序对》
  • Java实习模拟面试实录:字节跳动日常实习三面深度复盘 —— 集合、JVM、MySQL索引、Redis原理 + 手撕LRU,全面考察工程与底层能力!
  • 探索大数据领域数据中台的实时处理能力
  • Axolotl:把 LLM 微调从“脚本地狱”拉回到“配置即服务”的那一刻
  • Java实习模拟面试实录:网思科技(济南)后端岗45分钟深度拷打 —— SaToken原理、延迟双删、SQL优化、RAG流程全解析!
  • 分数取模的应用
  • AI代理记忆综述:从“短期失忆“到统一框架,一文读懂智能体记忆系统设计
  • $\chi^2(k)$
  • Java后端实习模拟面试实录:高并发、分布式与数据库核心问题深度解析(牛客网一面)
  • 热销榜单:2026年国内高口碑凤凰单丛茶厂家推荐 - 睿易优选
  • PMW-800-1000钢绞线锚具液压脉动疲劳试验系统
  • Java实习模拟面试实录:致远互联一面高频考点全解析 —— Spring MVC、线程安全、AOP、分库分表、MySQL优化一网打尽!
  • 导师要求降AI率怎么办?如何快速降低论文AIGC疑似度 - 我要发一区
  • HCIP第一次作业
  • 必看!2026年重庆预应力配件公司推荐排行榜,连接器预应力配件供应商哪家权威? - 睿易优选
  • PQW系列乘用车车轮旋转弯曲疲劳试验机
  • apple script 激活指定的vscode的窗口,以‘notes’开头的窗口
  • 2026年重庆1*7钢绞线厂家推荐,主要有哪些值得关注的供应商? - 睿易优选
  • 鼠大侠授权系统V2.0最新版下载
  • 论文降AI率要花多少钱?AIGC疑似度优化的成本分析 - 我要发一区