【发布时间】:2021-01-04 21:02:48
【问题描述】:
我正在尝试使用文本小部件打印表格。我已经创建了一种使用标签和框架来执行此操作的方法,但问题是我需要将更大的表格呈现到需要使用滚动条的地步。
我正在使用选项卡为文本小部件制作表格,效果很好,但我似乎无法找到一种方法来设置小部件的宽度以适合文本。我正在尝试使用下面的 get_width() 方法,但它并不总是有效。
宽度选项以字体的平均大小字符来衡量,但问题是选项卡“字符”的大小会有所不同。文本小部件的 tab 键工作方式与终端或文本文件的 print() 函数不同。
下面是我的代码:
from tkinter import *
import math
class App(Text):
def __init__(self, matrix, parent, **kwargs):
Text.__init__(self, parent, **kwargs)
self.parent = parent
self.matrix = matrix
temp = []
for row in matrix:
temp.append(len(row))
# Making sure all the rows are of equal length and string values...
for row in matrix:
for _ in range(max(temp) - len(row)):
row.append('')
matrix = [[str(matrix[r][c]) for c in range(len(matrix[0]))] for r in range(len(matrix))]
# I need to get the maximum length for each column in the matrix...
c_lengths = {}
for c in range(len(matrix[0])):
c_lengths.update({c: []})
for r in range(len(matrix)):
c_lengths[c].append(len(matrix[r][c]))
self.tab_list = []
for r in range(len(matrix)):
temp = []
for c in range(len(matrix[0])):
if c != len(matrix[0]) - 1:
tab_count = (math.floor(max(c_lengths[c])/8)+1)
'''if (tab_count + max(c_lengths[c])) % 8 == 0:
tab_count += 1'''
temp.append(tab_count)
tabs = ['\t'] * tab_count
string = matrix[r][c] + ''.join(tabs)
else:
string = matrix[r][c]
self.insert(END, string)
self.tab_list.append(sum(temp))
self.insert(END, '\n')
self.configure(state=DISABLED, wrap=NONE, width=self.get_width())
def get_width(self):
temp = []
for row in self.matrix:
temp.append(len(''.join(row)))
return max(temp) + max(self.tab_list)*4
if __name__ == '__main__':
import random
root = Tk()
root.state('zoomed')
m = [['0' for _ in range(5)] for _ in range(40)]
for i in range(40):
for j in range(5):
m[i][j] = '*' * random.randint(1, 25)
App(m, root, font=('Times', '12'), height=40).pack()
root.mainloop()
这个运行结果很好,但有时它会切断一些桌子。
【问题讨论】:
-
您的问题不清楚。您希望 Text 小部件可滚动吗?
-
@JacksonPro 我希望小部件自动调整宽度以适合里面的文本。我上面的 get_width() 方法并不总是有效,因为它取决于制表符的长度而变化。
-
我会给你一个答案你介意检查一下吗?可能不是 100% 正确。
-
是的,我可以检查你的答案@JacksonPro
-
我的答案是否适用于所有情况?
标签: python python-3.x tkinter