使用tkintertable控件建立tkinter的表格——支持拖拽、编辑等功能。

源码原始链接:https://github.com/dmnfarrell/tkintertable

教程链接:https://github.com/dmnfarrell/tkintertable/wiki/Usage
这是一个简单的小例子:

安装tkintertable

1
pip install tkintertable

简单使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from tkintertable import TableCanvas, TableModel
import tkinter as tk
root=tk.Tk()
tframe = tk.Frame(root)
tframe.pack()
table = TableCanvas(tframe)
table.show()
model = TableModel()
table = TableCanvas(tframe, model=model)
table = TableCanvas(tframe, model,
            cellwidth=60, cellbackgr='#e3f698',
            thefont=('Arial',12),rowheight=18, rowheaderwidth=30,
            rowselectedcolor='yellow', editable=True)


root.mainloop()

如果你熟悉tkinter,会发现这个表格是一个控件,就像其他的按钮、标签一样插进去就可以了。
下面显示一下效果:
(还有一个右键菜单的,但是截屏没法截下来。):在这里插入图片描述

直接从.csv中读取数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from tkintertable.Testing import sampledata
data=sampledata()
#print(data)

class TestApp(Frame):
    """Basic test frame for the table"""

    def __init__(self, parent=None):
        self.parent = parent
        Frame.__init__(self)
        self.main = self.master
        self.main.geometry('800x500+200+100')
        self.main.title('Test')
        f = Frame(self.main)
        f.pack(fill=BOTH,expand=1)
        table = TableCanvas(f)
        table.importCSV('....(csv路径)/test.csv')
        print (table.model.columnNames)
        table.show()
        return

app=TestApp()
app.mainloop()

csv中文件内容:
在这里插入图片描述

表格显示效果:
在这里插入图片描述
字体并不美观,原因是我使用linux默认字体演示的。如果换个字体,效果就会更好。

直接导入.xls的方法目前我还不知道……

插入以及删除数据

初始的时候有十行五列,因此行索引在0~9,列索引在0~4都是 可以的。如果要超出的话,就会报错。
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from tkintertable import TableCanvas, TableModel
from tkinter import *
import random
#from collections import OrderedDict

class TestApp(Frame):
    """Basic test frame for the table"""

    def __init__(self, parent=None):
        self.parent = parent
        Frame.__init__(self)
        self.main = self.master
        self.main.geometry('800x500+200+100')
        self.main.title('Test')
        f = Frame(self.main)
        f.pack(fill=BOTH,expand=1)
       
        table = TableCanvas(f)
       
        data=table.model.data
        table.model.setValueAt(123,3,4)
        table.model.setValueAt('hahaha',2,4)
        table.model.setValueAt(repr(type('haha')),1,4)
       
       
        print (table.model.columnNames)
        table.show()
        return

app=TestApp()
app.mainloop()

效果如图:
在这里插入图片描述
注意,插入类型如果不是字符串或数字的话,就极易报错。因此注意,一定要用repr()方法规范一下形式。

插入行、列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from tkintertable import TableCanvas, TableModel
from tkinter import *
import random
#from collections import OrderedDict

class TestApp(Frame):
    """Basic test frame for the table"""

    def __init__(self, parent=None):
        self.parent = parent
        Frame.__init__(self)
        self.main = self.master
        self.main.geometry('800x500+200+100')
        self.main.title('Test')
        f = Frame(self.main)
        f.pack(fill=BOTH,expand=1)
       
        table = TableCanvas(f)
       
        data=table.model.data
        table.show()# 注意,先show()完了之后再添加行和列,否则会报错。
       
        for i in range(3):        
            table.addColumn('add%d'%i)
        for i in range(4):
            table.addRow()
        print (table.model.columnNames)
       
        return

app=TestApp()
app.mainloop()

可以看到成功的又多了几行。不过请注意,table.show()之后才能插入行和列,要不是不行的!
在这里插入图片描述

表头的编辑可以直接在表格显示之后右键……