Tkinter教程之Grid篇

'''Tkinter教程之Grid篇'''
# Tkinter參考中最推薦使用的一個佈局器。實現機制是將Widget邏輯上分割成表格,在指定的位置放置想要的Widget就可以了。
'''1.第一個Grid例子'''
# -*- coding: cp936 -*-
#
 使用grid來佈局組件
from Tkinter import *
root 
= Tk()
# 創建兩個Label
lb1 = Label(root,text = 'Hello')
lb2 
= Label(root,text = 'Grid')

lb1.grid()
lb2.grid()

root.mainloop()
# grid有兩個最爲重要的參數,用來指定將組件放置到什麼位置,一個是row,另一個是column。如果不指定row,會將組件放置到第一個可用的行上,如果不指定column,則使用第一列。
'''2.使用row和column來指定位置'''
# -*- coding: cp936 -*-
#
 使用grid來佈局組件
from Tkinter import *
root 
= Tk()
# 創建兩個Label
lb1 = Label(root,text = 'Hello')
lb2 
= Label(root,text = 'Grid')

lb1.grid()
# 指定lb2爲第一行(使用索引0開始),第二列(使用索引0開始)
lb2.grid(row = 0,column = 1)

root.mainloop()
# grid有兩個最爲重要的參數,用來指定將組件放置到什麼位置,一個是row,另一個是column。如果不指定row,會將組件放置到第一個可用的行上,如果不指定column,則使用第一列。注意這裏使用grid時不需要創建,直接使用行列就可以。
'''3.爲其它組件預定位置'''
# 可以使用row/column來指定組件的放置位置,並預先留出空間,以務其它需要。
#
 -*- coding: cp936 -*-
#
 使用grid來佈局組件
from Tkinter import *
root 
= Tk()
# 創建兩個Label
Label(root,text = 'Hello').pack()
# 在第一行,第10列放置lb2
Label(root,text = 'Grid').grid(row = 0,column = 10)
# Lable(root,text = '3').grid(row = 0,column = 5)
root.mainloop()
# 這個例子中將lb2放置到第1行,第11列位置上,但運行結果與上一例從效果上看不出太大的區別。原因是:如果這個位置沒有組件的話,它是看不可見的。
'''4.將組件放置到預定位置上去'''
# -*- coding: cp936 -*-
#
 使用grid來佈局組件
from Tkinter import *
root 
= Tk()
# 創建兩個Label
Label(root,text = '1').grid()
# 在第1行,第11列放置lb2
Label(root,text = '2').grid(row = 0,column = 10)
Label(root,text 
= '3').grid(row = 0,column = 5)
root.mainloop()
# 可以看到Label('3')是位置Label('1')和Label('2')之間了,即Label('2')是在11列,Label('3')位於第3列
'''5.將兩個或多個組件同一個位置'''
# -*- coding: cp936 -*-
#
 多個組件同時grid到同一個表格位置
from Tkinter import *
root 
= Tk()
# 創建兩個Label
lb1 = Label(root,text = '1')
lb2 
= Label(root,text = '2')

# 將lb1和lb2均grid到(0,0)位置
lb1.grid(row = 0,column = 0)
lb2.grid(row 
= 0,column = 0)

def forgetLabel():
    
# grid_slaves返回grid中(0,0)位置的所有組件
    # grid_forget將這個組件從grid中移除(並未刪除,可以使用grid再將它顯示出來)
    print root.grid_slaves(0,0)[0].grid_forget() 

# 我測試時grid_salves返回的第一個值爲lb2,最後grid的那一個    
Button(root,text = 'forget last',command = forgetLabel).grid(row = 1)

root.mainloop()
# 這段代碼是用來證明,多個組件同時放置到同一個位置上會產生覆蓋的問題。對於grid_slaves返回的組件list如何排序,我沒有去查想着資料,在這個例子中使用索引0,返回的正好是lb2,然後再使用grid_forget將這個刪除從grid中移除,可以看到lb1顯示出來了。
'''6.改變列(行)的屬性值'''
# -*- coding: cp936 -*-
#
 設置column的屬性(columnconfigure)
from Tkinter import *
root 
= Tk()
# 創建兩個Label
lb1 = Label(root,text = '1',bg = 'red')
lb2 
= Label(root,text = '2',bg = 'blue')

# 將lb1和lb2分別放置到第1行的1,2列位置上
lb1.grid(row = 0,column = 0)
lb2.grid(row 
= 0,column = 1)

# 指定列的最小寬度爲100
root.columnconfigure(0,minsize = 100)
root.mainloop()
# 1與2的距離變的遠一些了。
#
 但如果這個位置沒有組件存在的話這個值是不起作用的.
#
 設置列或行(rowconfigure)的屬性時使用父容器的方法,不是自己調用。
'''7.組件使用多列(多行)'''
# -*- coding: cp936 -*-
#
 使用多行(多列)
from Tkinter import *
root 
= Tk()
# 創建如下佈局(一個字符佔用一個grid位置)
#
 A  E
#
 B C
#
 D
#
 A佔用(0,0)(0,1),B佔用(1,0),C佔用(1,1),D佔用(2,0),E佔用(0,2)
#
 創建5個Label,分別以背景色區別
lbA = Label(root,text = 'A',bg = 'red')
lbB 
= Label(root,text = 'B',bg = 'blue')
lbC 
= Label(root,text = 'C',bg = 'red')
lbD 
= Label(root,text = 'D',bg = 'blue')
lbE 
= Label(root,text = 'E',bg = 'blue')
# 以下爲佈局參數設置
lbA.grid(row = 0,column = 0,columnspan = 2)
lbB.grid(row 
= 1,column = 0)
lbC.grid(row 
= 1,column = 1)
lbD.grid(row 
= 2)
lbE.grid(row 
= 0,column = 2)

root.mainloop()
# A與B、D的區別,它左邊已改變,由於使用了兩個表格;
#
 C與E的區別:C的右邊與E的左邊對齊,也就是說E被放置到第2列的下一個位置了,原因由於A已使用了第2列。
'''8.設置表格中組件的對齊屬性'''
# -*- coding: cp936 -*-
#
 使用sticky設置對齊方式
from Tkinter import *
root 
= Tk()
# 創建兩個Label
Label(root,text = 'hello sticky').grid()
Label(root,text 
= 'Tkinter').grid()
# 創建兩個Label,並指定sticky屬性
Label(root,text = 'hello sticky').grid(sticky = W)
Label(root,text 
= 'Tkinter').grid(sticky = W)

root.mainloop()
# 默認屬性下,組件的對齊方式爲居中,設置sticky屬性可以控制對齊方式,可用的值(N,S,E,W)及其組合值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章