การนำ widgets มาประกอบรวมกัน

สมมติว่าเรามี widgets จำนวนเยอะๆแล้วอยากนำ widget เหล่านี้มารวมกันเป็นหนึ่ง GUI เราจะต้องมีวิธีในการกำหนดว่า widget ไหนควรจะอยู่ตำแหน่งใด

tkinter มี Geometry manager ซึ่งเป็นชุดคำสั่งที่จะช่วยให้เราจัดเรียง widget ได้อย่างสวยงาน โดยจะมีการจัดเรียงสามแบบให้เลือก

Pack เป็นการจัดเรียง widget โดยเอาไปแปะในหน้าต่างที่เป็น master ลักษณะคล้ายๆนำเอารูปสี่เหลี่ยมไปฟิตในกล่องสี่เหลี่ยมที่ใหญ่กว่า

Grid เป็นการจัดเรียง widget บน 2D grid (นึกภาพจัดเรียงรูปสี่เหลี่ยมบนกระดาษที่เป็นลักษณะตาราง ถ้านึกไม่ออกรอดูตัวอย่างข้างล่าง)

Place เป็นการจัดเรียง widget โดยกำหนดตำแหน่งชัดเจนด้วย xy coordinate

การจัดเรียงแบบ Pack

เราได้เห็นตัวอย่างการใช้ pack() ไปแล้ว การจัดเรียงแบบนี้จะเหมาะในกรณีที่เรามีหน้าต่างหรือ frame ขนาดใดก็ได้ แล้วเราต้องการที่จะใส่ widget หนึ่งอันหรือมากกว่าหนึ่งอันลงไปในหน้าต่าง แล้วเราอยากให้ widgets เกาะกันเป็นแถวแนวตั้งหรือแนวนอน และให้ widgets ทุกตัวปรับขนาดของตัวเองเพื่อให้ฟิตพื้นที่ที่มีภายในกรอบ ดูตัวอย่างภาพต่อไปนี้

from tkinter import *

root = Tk()

w = Label(root, text="Red", bg="red", fg="white")
w.pack()
w = Label(root, text="Green", bg="green", fg="black")
w.pack()
w = Label(root, text="Blue", bg="blue", fg="white")
w.pack()

root.mainloop()

Pack vertical

คำอธิบายโค้ด

จากโค้ดข้างบนเราสร้าง Label ขึ้นมาสามอัน จะเห็นว่าเราไม่ได้กำหนดขนาดหรือตำแหน่งให้ Label แต่ละอัน แต่ใช้คำสั่ง pack() ซึ่งจะจัดวางสาม label ให้ฟิตกับความสูงของหน้าต่างโดยอัตโนมัติ

เมื่อใช้คำสั่ง pack แล้วเราจะขยายขนาดของ Label ให้ความกว้างเต็มหน้าต่าง หรือจัดวางแบบเรียง widgets ต่อกันในแนวนอนก็ทำได้โดยใส่ arguments เพิ่มให้กับ function pack() ถ้าต้องการศึกษาเพิ่มเติมว่าการใช้ pack() ทำอย่างไรบ้าง ลองดูตัวอย่างในนี้ http://effbot.org/tkinterbook/pack.htm

การจัดเรียงแบบ Grid

การจัดเรียงแบบ grid เรียกว่าเป็นแบบที่ดีที่สุดสำหรับ tkinter

from tkinter import *

master = Tk()

l1 = Label(master, text="First")
l1.grid(row=0)
l2 = Label(master, text="Second")
l2.grid(row=1)

e1 = Entry(master)
e2 = Entry(master)

e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

master.mainloop()

Pack vertical

คำอธิบายโค้ด

เราสร้าง Label ขึ้นมาสองอัน แล้ววางมันลงบน grid ที่แถวแรก (row=0) และแถวที่สอง (row=1) จากนั้นเราสร้าง Entry (ช่องสำหรับพิมพ์ input) อีกสองอัน แล้วนำไปวางลงบน grid แถวที่หนึ่ง คอลัมภ์ที่สอง และแถวที่สอง คอลัมภ์ที่สอง ตามลำดับ

การจัดเรียงแบบ grid สามารถทำให้ซับซ้อนกว่านี้ได้อีกมาก ถ้าอยากลองศึกษาเพิ่มเติม ดูตัวอย่างต่อไปนี้ http://effbot.org/tkinterbook/grid.htm

การจัดเรียงแบบ Place

from tkinter import *

master = Tk()

b = Button(master, text ="Hello")

b.place(relx=0.3, rely=0.5)
master.mainloop()

คำอธิบายโค้ด

โค้ดข้างต้นสร้างปุ่มขึ้นมาแล้วนำไปวางไว้ที่ตำแหน่ง (x,y) = (0.3, 0.5) ตัวแปร relx คือ "relative x" หมายถึงตำแหน่งของ widget บนแกน x เมื่อเทียบกับตำแหน่งและขนาดของหน้าต่าง root ส่วน rely คือค่าตำแหน่งของ widget บนแกน y โดยค่าของ relx จะเป็น ตั้งแต่ 0 (จัด widget ชิดขอบซ้าย) ไปจนถึง 1 (จัด widget ชิดขอบขวา)

การวางแบบนี้ไม่ค่อยเป็นที่นิยม เพราะผู้ใช้ต้องคิดคำนวณตำแหน่งของแต่ละ widget เอง ถ้าคิดว่าเหมาะกับ GUI ที่เราจะสร้าง อ่านเพิ่มเติมได้ที่ http://effbot.org/tkinterbook/place.htm