使用Python在TkTable中插入行
你好,我正在尝试使用Tktable和我在网上找到的一个封装器来创建一个表格:http://tkinter.unpythonic.net/wiki/TkTableWrapper
我在添加行的时候遇到了困难。我一直在修改文件中包含的sample_test方法,但没有成功。
我的最终目标是在我的图形界面中有一个表格,然后每次从串口连接读取数据时写入一行。因此,我不知道我需要多少行。我可以预先分配一个非常大的表格,但这似乎会很慢。我预计会读取大量的数据包(可能有几万个)。
我尝试过insert_rows方法,但我觉得我并没有完全理解它是如何工作的,而且文档也有点简略。
另外,我无法让滚动条工作。虽然我可以通过在test.pack方法调用之前添加以下几行来轻松添加它,但它们在用鼠标滚动时不会滚动。我觉得绑定可能有问题:
scroll = Tkinter.Scrollbar(root)
test.configure(yscrollcommand=scroll.set)
scroll.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
任何帮助都会很感激。谢谢。
1 个回答
0
目前,sample_test 创建了一个状态为 'disabled' 的表格(这就是为什么你不能添加更多行的原因)。你可以尝试把它设置为 'normal',无论是在创建的时候,还是在你需要进行更改的时候,选择最适合你的方式。
def sample_test():
from Tkinter import Tk, Scrollbar, Button
def test_cmd(event):
print 'command'
def browsecmd(event):
print 'browsecmd'
#print event.__dict__
root = Tk()
quit = Button(root, text="QUIT", command=root.destroy)
quit.pack(side = 'bottom')
numrows, numcols = 10, 10
var = ArrayVar(root)
for y in range(numrows):
for x in range(numcols):
index = "%i,%i" % (y, x)
var[index] = index
test = Table(root,
rows=numrows+1,
cols=numcols+1,
state='normal',
width=6,
height=6,
titlerows=1,
titlecols=1,
roworigin=-1,
colorigin=-1,
selectmode='extended',
selecttype='row',
rowstretch='unset',
colstretch='last',
browsecmd=browsecmd,
flashmode='on',
variable=var,
usecommand=0,
command=test_cmd)
# http://effbot.org/zone/tkinter-scrollbar-patterns.htm
s = Scrollbar(root, orient='vertical', command=test.yview_scroll)
test.config(yscrollcommand=s.set)
s.pack(side='right', fill='y')
test.pack(expand=1, fill='both')
test.tag_configure('sel', background = 'yellow')
test.tag_configure('active', background = 'blue')
test.tag_configure('title', anchor='w', bg='red', relief='sunken')
data = ('py','t','h','o','n','','+','','Tk','')
def add_new_data(*args):
#test.config(state='normal')
test.insert_rows('end', 1)
r = test.index('end').split(',')[0] #get row number <str>
args = (r,) + args
idx = r + ',-1'
test.set('row', idx, *args)
test.see(idx)
#test.config(state='disabled')
root.after(3000, add_new_data, *data)
root.after(4000, add_new_data, *data)
root.mainloop()