最近學了 Python Tkinter 程式庫,可以將程式提供圖形化的使用者介面(GUI: Graphic User Interface)。有個作業的練習題目是這樣出的:請設計出以上的圖形化界面。剛好可以應用 Tkinter 程式庫的排版方式。

第一版程式:.pack()
我們第一種學到的 Tkinter 排版法則是 .pack()
當元件創造出來後,就要用排版方式將元件排進圖形介面上。
以下是第一版的作法:
Title_label.pack()
schoollot_label.pack()
schoollot_entry.pack()
name_label.pack()
name_entry.pack()
TC_label.pack()
TC_entry.pack()

元件都創造出來了!但是和我們的要求不大對。學號、姓名、國文應該都在輸入的左邊,而不是上面。
其實,就程式來說是正確的。因為 .pack() 是由上排到下方。但是 .pack() 裡面還有一個 side= 屬性,可以設定元件彼此的相關位置。所以,我們再來看第二版。
第二版:.pack(side=tk.LEFT)
Title_label.pack()
schoollot_label.pack(side=tk.LEFT)
schoollot_entry.pack(side=tk.LEFT)
name_label.pack(side=tk.LEFT)
name_entry.pack(side=tk.LEFT)
TC_label.pack(side=tk.LEFT)
TC_entry.pack(side=tk.LEFT)

看起來可以,但是學號、姓名、國文都在同一行。我們希望可以換行。.pack() 裡面還一個 tk.BUTTOM 屬性,可以再試第三版。
第三版:tk.LEFT 和 tk.BUTTOM 一起用
Title_label.pack()
schoollot_label.pack()
schoollot_entry.pack(side=tk.LEFT)
name_label.pack(side=tk.BOTTOM)
name_entry.pack(side=tk.LEFT)
TC_label.pack(side=tk.BOTTOM)
TC_entry.pack(side=tk.LEFT)

本以為可以達到換行的目的,看起來並不行。
最後一版:改換排版方式:.grid()
除了 .pack() 以外,tkinter 還有另外一種排版方式:.grid()
可以讓我們以二維陣列的方式來放置圖形元件。
仔細地看一下第一章要求的圖形:除了第一行字以外,其餘的都是左邊、右邊各一個元件。使用方式也很簡單:.grid(row=行數字,column=列數字)
而且行是由 0 開始計算。所以我們的程式就改成這樣:
Title_label.grid(row=0,column=0,columnspan=2)
schoollot_label.grid(row=1,column=0)
schoollot_entry.grid(row=1,column=1)
name_label.grid(row=2,column=0)
name_entry.grid(row=2,column=1)
TC_label.grid(row=3,column=0)
TC_entry.grid(row=3,column=1)

這裡只有第一行的文字要多一個參數;成績建檔系統,要將一列延伸到兩列,所以要多加一個參數:columnspan=2
