python tkinter grid 布局

1. 位置和大小设置

grid设置位置, columnconfigure, rowconfigure设置大小

2. Lable 示例

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3

import sys
import tkinter
import tkinter.ttk

def guiInit():
    top = tkinter.Tk()
    # 窗口大小和位置 WxH+X+Y
    # 窗口大小 宽800, 高480
    # 窗口位置 距左边200, 距上边100
    top.geometry('800x480+200+100')
    label1 = tkinter.ttk.Label(top, width=10, text='label1', relief='raised')
    label2 = tkinter.ttk.Label(top, width=10, text='label2', relief='raised')
    label3 = tkinter.ttk.Label(top, width=10, text='label3', relief='raised')
    label4 = tkinter.ttk.Label(top, width=10, text='label4', relief='raised')
    label5 = tkinter.ttk.Label(top, width=10, text='label5', relief='raised')
    label6 = tkinter.ttk.Label(top, width=10, text='label6', relief='raised')

    '''
    指定位置
        YourWidget.grip(row=N, column=N, sticky='nsew',
            rowspan=N, columnspan=N, padx=N, pady=N)
    指定大小: weight表示权重如果所有单元格全为1, 则表示等大小
        weight=0: YourWidget的实际大小,固定大小
        YourWidget.rowconfigure(N, weight=1)
        YourWidget.columnconfigure(N, weight=1)
    '''
    label1.grid(row=0,column=0, sticky='nsew')
    label2.grid(row=0,column=1, sticky='nsew')
    label5.grid(row=0,column=2, sticky='nsew', rowspan=2, padx=5, pady=5)
    label3.grid(row=1,column=0, sticky='nsew')
    label4.grid(row=1,column=1, sticky='nsew')
    label6.grid(row=2,column=0, sticky='nsew', columnspan=3)
    '''
    top.rowconfigure("all", weight=1)
    top.columnconfigure("all", weight=1)
    '''
    top.rowconfigure(0, weight=3)
    top.rowconfigure(1, weight=1)
    top.rowconfigure(2, weight=0)
    #top.columnconfigure([0, 1], weight=1)
    top.columnconfigure(0, weight=3)
    top.columnconfigure(1, weight=1)
    top.columnconfigure(2, weight=0)
    top.mainloop()

def main():
    guiInit()

if __name__ == '__main__' :
    main()

3. TreeView 示例

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python3

import sys
import tkinter
import tkinter.ttk
import pprint

## 0: grid geometry
## 1: pack geometry
bgrid = True

def guiInit():
    col = []
    datav = []
    data = {}

    for i in range(1, 100):
        col.append("col" + str(i))
        datav.append("data" + str(i) )

    for i in range(1, 100):
        data["line"+str(i)] = datav

    top = tkinter.Tk()
    # 窗口大小和位置 WxH+X+Y
    # 窗口大小 宽800, 高480
    # 窗口位置 距左边200, 距上边100
    top.geometry('800x480+200+100')
    tree = tkinter.ttk.Treeview(top, columns = col)

    tree.heading('#0', text="city")
    for colv in col:
        tree.column(colv, width=150, anchor='w')
        tree.heading(colv, text=colv)

    for k,v in data.items():
        itm = tree.insert("", "end", text=k, values=v)
        #pprint.pprint(tree.item(itm))

    yscrollbar = tkinter.ttk.Scrollbar(top, orient=tkinter.VERTICAL, command=tree.yview)
    xscrollbar = tkinter.ttk.Scrollbar(top, orient=tkinter.HORIZONTAL, command=tree.xview)

    tree.configure(yscrollcommand = yscrollbar.set)
    tree.configure(xscrollcommand = xscrollbar.set)

    if bgrid:
        ## 1. 设置位置
        tree.grid(row=0, column=0, sticky='nsew')
        yscrollbar.grid(row=0, column=1, sticky='nsew')
        xscrollbar.grid(row=1, column=0, sticky='nsew')

        ## 2. 设置大小
        ## tree@(0, 0):r.weight=1, c.weight=1
        ## 表格, row.weight = 1 高度随着窗口动态变化
        ## 表格, column.weight = 1 宽度随着窗口动态变化
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        ## xball@(1, 0): r.weight=0, c.weight=1
        ## 横向滚动条, row.weight = 0 高度不变
        ## 横向滚动条, column.weight = 1 宽度随着窗口动态变化
        top.rowconfigure(1, weight=0)
        ## yball@(0, 1):r.weight=1, c.weight=0
        ## 竖向滚动条, row.weight = 1 高度随着窗口动态变化
        ## 竖向滚动条, column.weight = 0 宽度不变
        top.columnconfigure(1, weight=0)
    else:
        yscrollbar.pack(side='right', fill='y')
        xscrollbar.pack(side='bottom', fill='x')
        tree.pack(side='top', expand = 1, fill = 'both')
    top.mainloop()

def main():
    guiInit()

if __name__ == '__main__' :
    main()