引言
Label组件在tkinter中算是十分基础的了。Label主要用来显示不可更改的文本信息,在程序UI中作为信息指示控件使用。
使用画布画出Label也是十分简单,思路与绘制按钮一样。
代码
由于过于简单,直接在TinUI类下加上这样一个函数:
def add_label(self,pos:tuple,text:str,fg='black',bg='#f0f0f0',outline='grey',font=('微软雅黑',12)):#绘制标签
'''
pos::位置
text::文字
fg::前景色
bg::背景色
outline::边框颜色
font::字体
'''
label=self.create_text(pos,text=text,fill=fg,font=font,anchor='nw')
bbox=self.bbox(label)
x1,y1,x2,y2=bbox[0]-3,bbox[1]-3,bbox[2]+3,bbox[3]+3
back=self.create_rectangle((x1,y1,x2,y2),fill=bg,outline=位置)
self.tkraise(label)
return label
由此看来,TinUI绘制Label实际上就是在绘制文字的基础上,加上一个背景颜色、边框而已。
由于实现简单,就不给出效果了(实际上在该系列专栏中的上一篇文章里就已经出现了)。
这只是引子。
排版思想(覆盖类)
这是TinUI最为核心的内容。
以绘制Label为例。
为什么我们不先绘制矩形,使矩形在下方?而且,tkinter的画布还有insert
函数,可以插入文字。
因为我们需要追求更加灵活的排版。
关于元素覆盖这一方面,TinUI采取的排版方式步骤如下:
- 先绘制无法直接得出占位的元素,如文字、图片等
- 获取先绘制元素的占位情况,使用
bbox
函数 - 绘制占位(尺寸)可控的元素
- 调整元素层次显示
在add_label
中体现如下:
#绘制无法确定尺寸的文字
label=self.create_text(pos,text=text,fill=fg,font=font,anchor='nw')
#获取文字尺寸
bbox=self.bbox(label)
#算出背景矩形的合适尺寸
x1,y1,x2,y2=bbox[0]-3,bbox[1]-3,bbox[2]+3,bbox[3]+3
#绘制矩形背景
back=self.create_rectangle((x1,y1,x2,y2),fill=bg,outline=位置)
#调整元素层次
self.tkraise(label)
return label
在TinUI以后的完善中,也会采取类似的排版思想。对于其它的情况,也会根据实际发展出不同的排版思想。
github项目
这里优化了刷新滚动,如果有更好的界面滚动功能,可以在下面的github地址中添加或改进。
结语
接下来将完成checkbutton。
🔆tkinter创新🔆