tkinter绘制组件(46)——分段按钮
tkinter绘制组件46——分段按钮引言布局函数结构所有元素文本布局转到指定位置处理鼠标信号完整代码函数效果2026-10-3 样式更新github项目pip下载引言分段按钮可以通过按钮的形式对同目的功能进行分类。布局函数结构defadd_segmentbutton(self,pos:tuple,fg#191919,bg#EDEDED,activefg#181818,activebg#E5E5E5,onbg#FAFAFA,line#E5E5E5,sign#3041d8,font微软雅黑 12,content(A,B,C),commandNone,anchornw): pos::位置 fg::文本颜色 bg::背景色 activefg::响应时文本颜色 activebg::响应时背景色 onbg::选中时背景色 line::边框颜色 sign::提示符颜色 font::字体 content::内容 command::回调函数必须接受一个参数选中的按钮文本 anchor::对齐方向 所有元素由于分段按钮有多个部件构成且现在TinUI已经实现了完善的布局计算功能所以先将所有需要的元素全部创建出来。index-1outlineself.__ui_polygon(((0,0),(0,0)),fillline,outlineline,width9)uidTinUIString(fsegmentbutton-{outline})buttonidf{uid}-buttonself.itemconfig(outline,tagsuid)backself.__ui_polygon(((0,0),(0,0)),fillbg,outlinebg,width9,tagsuid)buttonself.__ui_polygon(((0,0),(0,0)),fill,outline,width9,tagsuid)button2self.__ui_polygon(((0,0),(0,0)),fillonbg,outlineonbg,width9,tagsuid)lineself.create_line((0,0,0,0),fillsign,width3,tagsuid,capstyleround,statehidden)self.itemconfig(button2,statehidden)maxwidth0texts[]foriincontent:textself.create_text((0,0),texti,fontfont,fillfg,anchorn,tags(uid,buttonid))texts.append(text)bboxself.bbox(text)maxwidthmax(maxwidth,bbox[2]-bbox[0])self.tag_bind(text,Enter,lambdae,texttext:mouse_in(text))self.tag_bind(text,Leave,lambdae,texttext:self.itemconfig(text,fillfg))self.tag_bind(text,Button-1,lambdae,texttext:__click(text))这里面分别是背景、边框、按钮文本、选择元素、选定元素、提示线。文本布局分段按钮采用水平等宽布局因此上面的代码中记录了maxwidth各按钮文本居中布局。endxmaxwidth/2foriintexts:self.coords(i,endx,0)endxmaxwidth10bboxself.bbox(buttonid)width(maxwidth10)*content.__len__()-10coord(0,bbox[1],width,bbox[1],width,bbox[3],0,bbox[3])self.coords(back,coord)coord(-1,bbox[1]-1,width1,bbox[1]-1,width1,bbox[3]1,-1,bbox[3]1)self.coords(outline,coord)转到指定位置self.__auto_anchor(uid,pos,anchor)处理鼠标信号由于选定和选择会同时存在因此这里使用了两个圆角矩形元素来响应鼠标事件。当鼠标选择文本时由button响应选定时由button2响应。鼠标的离开由整个控件告知button。defmouse_in(cid):bboxself.bbox(cid)centerx(bbox[0]bbox[2])/2halfwidthmaxwidth/2x1centerx-halfwidth x2centerxhalfwidth coord(x1,bbox[1],x2,bbox[1],x2,bbox[3],x1,bbox[3])self.coords(button,coord)self.itemconfig(button,fillactivebg,outlineactivebg)self.itemconfig(cid,fillactivefg)defon_leave(e):self.itemconfig(button,fill,outline)def__click(cid):nonlocalindexifindex-1:self.itemconfig(button2,statenormal)self.itemconfig(line,statenormal)ifcidindex:returnindexcid bboxself.bbox(cid)centerx(bbox[0]bbox[2])//2halfwidthmaxwidth/2x1centerx-halfwidth x2centerxhalfwidth coord(x1,bbox[1],x2,bbox[1],x2,bbox[3],x1,bbox[3])self.coords(button2,coord)self.coords(line,((bbox[0]bbox[2])/2-maxwidth/4,bbox[3]2,(bbox[0]bbox[2])/2maxwidth/4,bbox[3]2))ifcommand:command(self.itemcget(cid,text))完整代码函数defadd_segmentbutton(self,pos:tuple,fg#191919,bg#EDEDED,activefg#181818,activebg#E5E5E5,onbg#FAFAFA,line#E5E5E5,sign#3041d8,font微软雅黑 12,content(A,B,C),commandNone,anchornw):# 绘制一个选项按钮defmouse_in(cid):bboxself.bbox(cid)centerx(bbox[0]bbox[2])/2halfwidthmaxwidth/2x1centerx-halfwidth x2centerxhalfwidth coord(x1,bbox[1],x2,bbox[1],x2,bbox[3],x1,bbox[3])self.coords(button,coord)self.itemconfig(button,fillactivebg,outlineactivebg)self.itemconfig(cid,fillactivefg)defon_leave(e):self.itemconfig(button,fill,outline)def__click(cid):nonlocalindexifindex-1:self.itemconfig(button2,statenormal)self.itemconfig(line,statenormal)ifcidindex:returnindexcid bboxself.bbox(cid)centerx(bbox[0]bbox[2])//2halfwidthmaxwidth/2x1centerx-halfwidth x2centerxhalfwidth coord(x1,bbox[1],x2,bbox[1],x2,bbox[3],x1,bbox[3])self.coords(button2,coord)self.coords(line,((bbox[0]bbox[2])/2-maxwidth/4,bbox[3]2,(bbox[0]bbox[2])/2maxwidth/4,bbox[3]2))ifcommand:command(self.itemcget(cid,text))index-1outlineself.__ui_polygon(((0,0),(0,0)),fillline,outlineline,width9)uidTinUIString(fsegmentbutton-{outline})buttonidf{uid}-buttonself.itemconfig(outline,tagsuid)backself.__ui_polygon(((0,0),(0,0)),fillbg,outlinebg,width9,tagsuid)buttonself.__ui_polygon(((0,0),(0,0)),fill,outline,width9,tagsuid)button2self.__ui_polygon(((0,0),(0,0)),fillonbg,outlineonbg,width9,tagsuid)lineself.create_line((0,0,0,0),fillsign,width3,tagsuid,capstyleround,statehidden)self.itemconfig(button2,statehidden)maxwidth0texts[]foriincontent:textself.create_text((0,0),texti,fontfont,fillfg,anchorn,tags(uid,buttonid))texts.append(text)bboxself.bbox(text)maxwidthmax(maxwidth,bbox[2]-bbox[0])self.tag_bind(text,Enter,lambdae,texttext:mouse_in(text))self.tag_bind(text,Leave,lambdae,texttext:self.itemconfig(text,fillfg))self.tag_bind(text,Button-1,lambdae,texttext:__click(text))endxmaxwidth/2foriintexts:self.coords(i,endx,0)endxmaxwidth10bboxself.bbox(buttonid)width(maxwidth10)*content.__len__()-10coord(0,bbox[1],width,bbox[1],width,bbox[3],0,bbox[3])self.coords(back,coord)coord(-1,bbox[1]-1,width1,bbox[1]-1,width1,bbox[3]1,-1,bbox[3]1)self.coords(outline,coord)self.tag_bind(uid,Leave,on_leave)self.__auto_anchor(uid,pos,anchor)deltexts,endx,coord,bbox uid.layoutlambdax1,y1,x2,y2,expandFalse:self.__auto_layout(uid,(x1,y1,x2,y2),anchor)returnback,outline,button,button2,line,uid效果暗黑样式2026-10-3 样式更新添加了线性过渡动画。github项目TinUI的github项目地址pip下载pipinstalltinui

相关新闻

GitHub日榜趋势系统:从数据采集到开源生态观测

GitHub日榜趋势系统:从数据采集到开源生态观测

1. 项目概述:这不是一份榜单,而是一套可复用的趋势观测系统 “GitHub 日榜趋势速报 | 2026-10-02”这个标题乍看像一条新闻推送,但作为连续追踪 GitHub 全站活跃度六年的从业者,我必须说——它背后藏着一套被严重低估的工程化能力…

2026/10/4 9:46:36 阅读更多 →
STAR-CCM+二维NACA翼型气动计算全流程:从几何建模到极曲线

STAR-CCM+二维NACA翼型气动计算全流程:从几何建模到极曲线

1. 为什么用STAR-CCM算二维翼型——先把目标和思路理清楚1.1 二维翼型气动性能计算到底要算什么先说结论:NACA翼型的二维气动性能计算,是整个空气动力学入门绕不开的一关。无论你是在校学生做课程设计,还是在企业里做无人机螺旋桨、风机叶片、…

2026/10/5 11:57:26 阅读更多 →
缠论程序化入门:用Python实现分型与笔的识别

缠论程序化入门:用Python实现分型与笔的识别

缠论这套技术分析体系,这些年讨论热度一直不低,很多人一开始都是被“分型、笔、线段、中枢”这些概念给唬住了,感觉门槛很高。但真要说程序化落地,第一步其实没有想象中那么玄乎。把分型和笔的定义搞清楚,用Python写一…

2026/10/5 11:57:39 阅读更多 →

最新新闻

45岁程序员降薪求稳?揭秘薪资谈判背后的中年生存法则

45岁程序员降薪求稳?揭秘薪资谈判背后的中年生存法则

“面试了一个45岁的程序员,他要月薪2万,我同意了;结果面试完把他送到电梯口,他说如果是14薪的话,月薪1.8万也行。”这条内容在程序员圈子里传得很快。很多人都把注意力放在“45岁还要降薪求稳”上,但作为一…

2026/10/5 11:57:38 阅读更多 →
Linux进程生命周期:退出、收尸与exec替换

Linux进程生命周期:退出、收尸与exec替换

写代码这么多年,我一直觉得Linux下的进程生命周期是整个操作系统里反馈最明显、也最容易踩坑的一环。一个程序从被启动到运行结束,中间经历的退出方式、父进程如何采集退出状态、以及如何把子进程替换成另一个可执行文件,这三件事理解不清楚&…

2026/10/5 11:57:38 阅读更多 →
Grok Bot主动建议功能实战:从被动响应到智能协作者的设计与配置

Grok Bot主动建议功能实战:从被动响应到智能协作者的设计与配置

1. 主动建议功能到底解决了什么痛点做聊天机器人这行的朋友应该都有体会,过去几年我们做的绝大多数对话系统,本质上都是“被动响应式”的——用户问一句,机器人答一句,用户不吭声,机器人就干等着。这种模式在客服场景里…

2026/10/5 11:57:38 阅读更多 →
对话机器人主动建议功能实战:触发策略、生成排序与落地排查

对话机器人主动建议功能实战:触发策略、生成排序与落地排查

1. 从“你问我答”到“我猜你需要”:主动建议功能到底改变了什么 做对话机器人这行十来年,我见过太多产品卡在同一个瓶颈上:用户不开口,机器人就是个摆设。你问一句它答一句,你不问它就永远沉默,这种“被动…

2026/10/5 11:57:37 阅读更多 →
PyTorch MPS 推理实战:Mac GPU 加速与算子适配指南

PyTorch MPS 推理实战:Mac GPU 加速与算子适配指南

简介:这份PDF面向深度学习推理优化与部署方向的工程师与架构师,聚焦NVIDIA MPS(Multi-Process Service)技术,帮助解决GPU利用率偏低、CPU推理效率不足等性能瓶颈问题。内容从背景介绍、技术选型动因切入,系…

2026/10/5 11:57:37 阅读更多 →
风光储互补微电网Simulink仿真:建模、控制与调试全流程解析

风光储互补微电网Simulink仿真:建模、控制与调试全流程解析

在微电网相关的项目里泡了大半年,最常听到的问题是:光伏、风机、电池三个模型都拖进Simulink了,为什么一跑就发散,或者跑出来的曲线跟“互补”两个字完全不沾边?问题通常不在某个模块的参数,而在对整套系统…

2026/10/5 11:56:36 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →