在文本控件中写入类似表格样式,需要自己调整,且值大于字段名设置长度时用省略号表示(目前只能用这种笨的方法,先记录,以后有新的方法再改动)
其中用了两种方式窗口展示:
1.自定义改动窗口大小显示所有值,且垂直拉动窗口时垂直拉条隐藏, 测试代码如下:
可参考文章:链接: https://zhuanlan.zhihu.com/p/344287019?utm_id=0
import tkinter as tk
from tkinter import ttk
class AutoHideScrollbar(ttk.Scrollbar):
def set(self,upper,lower): # 继承ttk.Scrollbar (tk.Scrollbar),重写覆盖父类的set()方法,实现自动隐藏滚动条
#滚动条可以看做一个在0到1之间从上到下的单向坐标系,upper 起始值为0,表示滚动条上方在坐标系中的值(浮点值表示);lower 表示滚动条最下方在坐标系中对应的值,最大为1。而当upper=0,lower=1时,就表示滚动条占据了整个空间,此时就可以触发他的隐藏方法。
if float(upper) <= 0.0 and float(lower) >= 1.0:
self.grid_remove() # 需要注意的是,隐藏滚动条组件的方法是用的grid_remove(),而不能使用grid_forget()方法
else:
self.grid()
ttk.Scrollbar.set(self,upper,lower)
root = tk.Tk()
screenwidth = root.winfo_screenwidth() # 屏幕宽度
screenheight = root.winfo_screenheight() # 屏幕高度
width = 1310
height = 200
x = int((screenwidth - width) / 2)
y = int((screenheight - height) / 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.title('test')
a=[[{'AC_DT': datetime.datetime(2023, 1, 9, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01', 'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000, 'MERC_FEE_AMT': None}],
[{'AC_DT': datetime.datetime(2022, 12, 10, 0, 0),
'T42_MERC_ID': '826daposb000057+++++5556', 'CARD_TYPE': '01', 'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],
[{'AC_DT': datetime.datetime(2022, 11, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}]]
"""ww=x-130
hh=y-10
test_1=tk.Text(root,wrap=tk.NONE, width=ww,height=hh)"""
test_1=tk.Text(root,wrap=tk.NONE)
test_1.grid(row=0, column=0, padx=5, sticky=tk.N + tk.E + tk.W + tk.S)
#垂直拉条
bar=AutoHideScrollbar(root) #调用方法
bar.grid(row=0, column=10, sticky='N' + 'S')
bar.config(command=test_1.yview)
test_1.config(yscrollcommand=bar.set) #拉条跟着移动方向
aa=list(a[0][0].keys()) #取数组中字典的key
global d,r
#循环取数组中的key插入作为字段名
for r in range(len(aa)):
#name = tk.Text(root, width=15, height=1)
test_1.insert('end', aa[r])
if len(aa[r])<20:
test_1.insert('end', ' '*(20-len(str(aa[r])))) #插入20减去字符数的空格
test_1.insert('end', ' | ') #增加表格线
#name.grid(row=0, column=r)
if aa[r]=='MERC_FEE_AMT':
test_1.insert('end', '\n')
#test_1.insert('end', '-'*(26*r)+'|\n')
test_1.insert('end', ('-' * 20 +'-|-')* (r+1) + '\n') #增加表格线
#循环取数组中的值作为字段值,因为是数组所以需要先取有多少组值
for d in range(len(a)):
bb = list(a[d][0].values()) #取数组中字典的值
for j in range(len(bb)):
#值为none时插入失败,需要加判断
if bb[j] == None:
test_1.insert('end', 'None'+' '*16+' |\n')
else:
#字段名的空间设置了长度约20
if len(str(bb[j]))<20:
test_1.insert('end', bb[j])
test_1.insert('end', ' '*(20-len(str(bb[j]))))
#长度大于20的其余值显示为省略号(目前的效果)
elif len(str(bb[j])) >= 20:
print(bb[j][:15])
test_1.insert('end', bb[j][:17])
test_1.insert('end', '.' * (20 - len(str(bb[j][:17]))))
test_1.insert('end', ' | ')
test_1.insert('end', ('-' * 20 +'-|-')* (r+1) + '\n') #增加表格线
root.mainloop() #运行窗口
效果如下:
运行后:
拉动放大窗口后垂直条隐藏:
最大化:
2.设置水平与垂直拉条显示,代码如下:
import tkinter as tk
root = tk.Tk()
root.geometry('950x200+100+100')
root.title('test')
a=[[{'AC_DT': datetime.datetime(2023, 1, 9, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01', 'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000, 'MERC_FEE_AMT': None}],
[{'AC_DT': datetime.datetime(2022, 12, 10, 0, 0), 'T42_MERC_ID': '826daposb000057+++++5556', 'CARD_TYPE': '01', 'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],
[{'AC_DT': datetime.datetime(2022, 11, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}],[{'AC_DT': datetime.datetime(2022, 10, 10, 0, 0), 'T42_MERC_ID': '826daposb000057', 'CARD_TYPE': '01',
'T41_TRM_NO': 'daphl057', 'AGT_MERC_ID': '8011027000003X6',
'T4_TXN_COUNT': 1, 'T4_TXN_AMT': 8800000,
'MERC_FEE_AMT': None}]]
test_1=tk.Text(root,wrap=tk.NONE, width=130,height=10)
test_1.grid(row=0, column=0, padx=5, sticky=tk.N + tk.E + tk.W + tk.S)
aa=list(a[0][0].keys()) #取数组中字典的key
#水平拉条
bar1 = tk.Scrollbar(root, orient=tk.HORIZONTAL)
bar1.config(command=test_1.xview)
bar1.grid(row=6, column=0,columnspan=50, sticky='W' + 'E') #
test_1.config(xscrollcommand=bar1.set)
#垂直拉条
bar=tk.Scrollbar(root, orient=tk.VERTICAL)
bar.grid(row=0, column=50, sticky='N' + 'S')
bar.config(command=test_1.yview)
test_1.config(yscrollcommand=bar.set) #拉条跟着移动方向
global d,r
#循环取数组中的key插入作为字段名
for r in range(len(aa)):
#name = tk.Text(root, width=15, height=1)
test_1.insert('end', aa[r])
if len(aa[r])<20:
test_1.insert('end', ' '*(20-len(str(aa[r])))) #插入20减去字符数的空格
test_1.insert('end', ' | ') #增加表格线
#name.grid(row=0, column=r)
if aa[r]=='MERC_FEE_AMT':
test_1.insert('end', '\n')
#test_1.insert('end', '-'*(26*r)+'|\n')
test_1.insert('end', ('-' * 20 +'-|-')* (r+1) + '\n') #增加表格线
#循环取数组中的值作为字段值,因为是数组所以需要先取有多少组值
for d in range(len(a)):
bb = list(a[d][0].values()) #取数组中字典的值
for j in range(len(bb)):
#值为none时插入失败,需要加判断
if bb[j] == None:
test_1.insert('end', 'None'+' '*16+' |\n')
else:
#字段名的空间设置了长度约20
if len(str(bb[j]))<20:
test_1.insert('end', bb[j])
test_1.insert('end', ' '*(20-len(str(bb[j]))))
#长度大于20的其余值显示为省略号(目前的效果)
elif len(str(bb[j])) >= 20:
print(bb[j][:15])
test_1.insert('end', bb[j][:17])
test_1.insert('end', '.' * (20 - len(str(bb[j][:17]))))
test_1.insert('end', ' | ')
test_1.insert('end', ('-' * 20 +'-|-')* (r+1) + '\n') #增加表格线
root.mainloop()
运行效果如下:
拉动水平条: