tkinter绘制组件(52)——标签栏
tkinter绘制组件52——标签栏引言布局函数结构整体标签元素标签添加标签删除效果github项目pip下载引言标签栏labels用于呈现若干特定属性的文本相比于普通文本标签栏有着精简、突出的文本意义。布局函数结构defadd_labels(self,pos:tuple,fg#000000,bg#fdfdfd,activefg#1b1b1b,activebg#f9f9f9,outline#eeeeee,fontNone,widgetTrue,anchornw,commandNone):# 绘制一个标签栏 widget::是否显示添加按钮 command::添加按钮的回调函数需要返回标签名[, 删除回调函数] 整体TinUI的标签栏采用两种交互模式一种是仅显示特定标签另一种是允许通过控件本身交互进行标签的增删。无论是哪一种交互模式控件主体布局都是一致的。逻辑上标签栏水平展示所有标签每个标签文本使用“胶囊”形状的图形元素包裹。对于第二种交互模式需要额外一个添加按钮通过某种回调交互添加新的标签所有标签都添加在末尾。另外添加标签时可以选择是否允许标签删除并产生相应回调。由于标签栏在实现上相比于过往的那些控件并不复杂因此下文主要以代码为主。标签元素添加按钮与常规标签几乎一模一样因此本文省略添加按钮的绘制。textself.create_text(endx,endy,textlabel,fontfont,fillfg,tagsuid)textuidflabel-text-{text}self.addtag_withtag(textuid,text)bboxself.bbox(text)width(bbox[2]-bbox[0])*2//3heightbbox[3]-bbox[1]ifheight%20:height1linewheightself.scale_value(2)backself.create_line(endx-width,endy,endxwidth,endy,fillbg,widthheight,tags(uid,textuid),capstyleround)lineself.create_line(endx-width,endy,endxwidth,endy,filloutline,widthlinew,tags(uid,textuid),capstyleround)self.tag_raise(back)self.tag_raise(text)这里确保linew是奇数是因为tkinter的绘制特性奇数更对称好看。如果允许标签被删除就添加删除提示符并且微调标签文本位置向左。ifcallable(oncancel):self.move(text,-self.scale_value(3),0)canceltself.create_text(bbox[2]-self.scale_value(2),endy,anchorw,text\uE711,fontsegoe_font,tags(uid,textuid),fillbg)self.tag_bind(cancelt,Enter,on_enter)self.tag_bind(cancelt,Leave,on_leave)self.tag_bind(cancelt,Button-1,on_click)labell.append(cancelt)这里的oncancel是回调函数如果可被调用则标识该标签可被删除。标签添加bboxself.bbox(line)widthbbox[2]-bbox[0]self.__auto_anchor(textuid,(endx,endy),w)self.dtag(textuid)endxwidth# 调整下一个的插入位置labell.append(labels.__len__())# 当前位置ifwidget:self.move(plusuid,width,0)labels.append(labell)labels是列表[[text, back, line, [cancelt], index], ...]。标签删除oncancel(label)self.delete(text,back,line,cancelt)indexlabell[-1]foritemsinlabels[index:]:items[-1]-1foriteminitems[:-1]:self.move(item,-width,0)ifwidget:self.move(plusuid,-width,0)endx-width labels.pop(index)对于被删除标签之后的标签需要对它们的位置序号-1。效果github项目TinUI的github项目地址pip下载pipinstalltinui