การนำ 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()
คำอธิบายโค้ด
จากโค้ดข้างบนเราสร้าง 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()
คำอธิบายโค้ด
เราสร้าง 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