tkinter显示多行内容的表格单元
引言
在tkinter中,有一个原生的表格控件,但实际上它属于TreeView类。这个表格可以满足最基本的表格功能,而且拉动表头还可以调整列宽。但是,当我们想要在一个表格单元中显示多个内容的时候,TreeView就没有办法做到了。
如tkinter的表格拓展——TkSheet,目前也无法在一个单元格中嵌入多行内容。
我们这里仅以tkinter表格的多行文本能力为讨论点。
为何需要单元格显示多行内容
很多人认为表格单元一次显示一行,也就是一个值就OK了。但是,我们有时候想要显示一个文本段,这样势必会发生宽度越界,甚至是想要换行而无法呈现的情况。
那么我们希望能够在一个单元格中显示一段完整的文本。
是否有现成的组件
有是有的,但是并不是一个专业的表格组件,仅仅是实现了多行文本的显示和各单元格最大高度和宽度的自动适配。这就是TinUI绘制的表格。
因为我们这里只讨论多行显示,因此就直接使用这个现成的工具。
TinUI是一个绘制组件的合集,而我们需要使用其最基础的表格控件。
TinUI需要使用pip下载,无任何第三方依赖。
使用最基本的BasicTinUI
BasicTinUI是TinUI的基础类,BasicTinUI只能进行组件绘制,而TinUI在其基础上添加了滚动条可视范围和自动刷新的功能。
form tinui.TinUI import BasicTinUI
#...
绘制表格的语法
在TinUI中,表格数据使用二维元组(列表等)结构作为参数。
其固定格式如下:
((title1,title2,title3,...),
(line1-1,line1-2,line1-3,...),
(line2-1,line2-2,line2-3,...),
...
)
不难看出,数据结构有两个拓展方向:
- 横向拓展:子元组内元素个数代表列数
- 纵向拓展:子元素所在函数代表表格中的行数
当然,以上是仿表格写法,但写成以下格式不方便观察:
((title1,title2,title3,...),(line1-1,line1-2,line1-3,...),(line2-1,line2-2,line2-3,...),...)
除此之外,还需要注意几点:
- 子元组的各个元素必须为字符串
- 各子元组中元素个数要相同
参数和返回值
关于TinUI的add_table
的具体参数,说明文档中已经列出:
TinUI.add_table(self,pos:tuple,outline='#E1E1E1',fg='black',bg='white',data=[['1','2','3'],['a','b','c']],minwidth=100,font=('微软雅黑',12),headbg='#d9ebf9')
'''
pos::位置
outline::边框颜色
fg::文本颜色
bg::文本背景颜色
data::表格数据。格式:((title,...,...),(content1,...,...),(content2,...,...),...)
minwidth::单元格最小宽度
font::字体
headbg::表头背景色
'''
#return: uid
这里值得注意的是,我们可以设置单元格最小宽度。
示例代码
在TinUI的展示代码中,使用了如下代码来创建表格:
b.add_table((180,630),data=(('a','space fans over the\nworld','c'),('you\ncan','2','3'),('I','II','have a dream, then try your best to get it!')))
这是代码片段,不是完整代码。
效果如下:
此时,数据结构为:
(('a','space fans over the\nworld','c'),
('you\ncan','2','3'),
('I','II','have a dream, then try your best to get it!'))
我们可以发现,第一行元素(表头)中,存在换行(第二个元素),TinUI的表格组件适应了最大宽度,并且前后两个表头的高度也匹配了中间的单元格。
另外,第三行最后一个元素是超出行宽度的,TinUI也适配了行宽度,并且使同一行的另外两个单元格适配统一高度。
结语
借助TinUI的表格绘制功能,我们很快就实现了在tkinter表格的一个单元格中显示任意我们想要显示的文本段落,这使得tkinter的数据显示结构更加开放兼容。
☀tkinter创新☀