[TH] PyTk

บทความนี้กล่าวถึง pytk อันเป็นไลบรารีเชื่อมประสานกับผู้ใช้แบบกราฟิกส์ หรือ GUI (Graphics User Interface) ของภาษาไพธอนที่เรียกใช้ tkinter (TK Interface) ทำให้สามารถเขียนโปรแกรม GUI ที่ทำงานได้ทั้งระบบปฏิบัติการ Windows, Linux และ macOS โดยการทำงานของ tkinter ของไพธอนเป็นการเชื่อมประสานกับไลบรารี Tcl/Tk อีกชั้นหนึ่ง และบทความนี้ใช้ Thonny เป็น IDE ในการเขียนโปรแกรมตัวอย่าและติดตั้งไลบรารี (อ่านบทความการใช้ Thonny)

การใช้งานจะต้องมีไลบรารี pytk ซึ่งสามารถเขียนโค้ดเพื่อทดสอบการติดตั้งไลบรารีด้วยโค้ดโปรแกรมภาษาไพธอนดังต่อไปนี้

try:
    import tkinter as tk
except ImportError:
    import sys
    print("ไม่พบไลบรารี tkinter!!!")
    sys.exit(0)
print("พร้อมสำหรับ tkinter")

ติดตั้งไลบรารี pytk

การติดตั้งไลบรารี pytk กระทำได้จากหน้าต่าง Mange packages จากเมนู Tools (ภาพ ข-1) หลังจากนั้นดำเนินการติดตั้งไลบรารีตามขั้นตอนต่อไปนี้

1. พิมพ์ชื่อไลบรารี (pytk)
2. Search on PyPi
3. เลือกรายชื่อไลบรารี pytk จาก Search results

4. แสดงรายละเอียดของไลบรารี ดังภาพ ข-2
5. กรณีที่ยังไม่มีในระบบจะแสดงปุ่ม Install
6. คลิก Install

7. กรณีที่ติดตั้งใหม่/ปรับปรุงจะแสดงหน้าต่างการติดตั้ง/ปรับปรุงดังภาพ ข-3

8. เมื่อติดตั้งเสร็จจะแสดงปุ่ม Uninstall สำหรับกรณีที่ต้องการถอนการติดตั้ง แต่ถ้าไม่มีปุ่มนี้แสดงให้ถอนการติดตั้งจะหมายความว่า ไลบรารีนั้นถูกใช้งานโดยโปรแกรม Thonny ดังภาพ ข-4 9. ถ้าไลบรารีมีรุ่นใหม่จะยอมให้ผู้ใช้งานสามารถคลิกที่ปุ่ม Upgrade

การเขียนโปรแกรมใช้งาน pytk

ขั้นตอนการเขียนโปรแกรมเพื่อใช้งาน tkinter คือ
                    1. นำเข้า tkinter
                    2. สร้างตัวอ้างอิงหน้าต่างให้เป็นตัวแปรประเภท tk.Tk()
                    3. กำหนด caption ของหน้าต่างด้วย title(“ข้อความ”)
                    4. กำหนดขนาดของหน้าต่างด้วย geometry(“กว้างxสูง”)
                    3. เขียนส่วนเชื่อมประสานกับผู้ใช้
                              3.1 สร้างวิดเจ็ต
                              3.2 กำหนดการเชื่อมต่อเหตุการณ์
                              3.3 ผนวกวิดเจ็ตเข้าหน้าต่าง
                    4. เรียก mainloop() เพื่อวนรอบการทำงาน

import tkinter as tk
app = tk.Tk()
app.title("โปรแกรมของฉัน")
app.mainloop()

          ตัวอย่างผลลัพธ์ที่ได้จากโปรแกรม ข-1 เป็นดังภาพ ข-5

การควบคุมการปรับขนาดของหน้าต่าง (resizable) ใช้คำสั่ง resizable() โดยระบุความกว้างและความสูงของหน้าต่างที่ต้องการดังรูปแบบต่อไปนี้

ตัวแปรหน้าต่าง.resizable(  ด้านกว้าง, ด้านสูง )

โดย                ด้านกว้างมีค่าเป็น True หรือ False
                              ด้านสูงมีค่าเป็น True หรือ False

กรณีที่ต้องการปิดหน้าต่างจะต้องเรียกใช้เมธอด destroy() เพื่อทำลายหน้าต่างที่สร้างไว้

ตัวแปรหน้าต่าง.destroy(   )

นอกเหนือจากหน้าต่างที่ต้องสร้างแล้ว ผู้เขียนโปรแกรมจะต้องเพิ่มวิดเจ็ต (Widget) หรือส่วนประกอบที่ใช้กับ tkinter ที่ใช้บ่อยได้แก่

  • Label() สำหรับแสดง
  • Button() สำหรับสร้างปุ่ม
  • Entry() สำหรับสร้างกล่องรับข้อความ

          หลังจากที่ได้สร้างวิตเจ็ตต่าง ๆ ครบตามที่ต้องการจะต้องเข้าสู่ขั้นตอนการผนวกวิดเจ็ตเข้ากับหน้าต่างของ tkinter จะใช้คำสั่ง pack() ก่อนบรรทัดที่เรียกใช้ mainloop() เช่น

		tk.Label(text=“นวัตกรรมคอมพิวเตอร์”).pack()

หรือ

		label = tk.Label(text=“นวัตกรรมคอมพิวเตอร์”)
		label.pack()

การใช้ Label

ขั้นตอนการใช้งานวิดเจ็ตประเภท Label คือ
          1.  สร้างวัตถุประเภท Label
                    1.1 กำหนดข้อความที่แสดงผ่านพารามิเตอร์ text
                    1.2 กำหนดรูปแบบตัวอักษรด้วย font=(‘ชื่อฟอนต์’,ขนาด)
                    1.3 กำหนดสีพื้นหลังด้วย bg = “ชื่อสี”
                    1.4 กำหนดสีตัวอักษรด้วย fg = “ชื่อสี”
                    1.5 กำหนดความกว้างของพื้นที่แสดงผลด้วย width
                    1.6 กำหนดความสูงของพื้นที่แสดงผลด้วย height
                    1.7 กำหนดการแสดงแบบแนวตั้งด้วย wrap=True
          2. ทำการ pack

          การกำหนดระยะห่างระหว่างวิดเจ็ตทำได้ด้วยการระบุพารามิเตอร์ padx หรือ pady ในคำสั่ง pack() ดังนี้
                    padx = ระยะห่างในแนวนอน
                    pady = ระยะห่างในแนวตั้ง

          การกำหนดวิธีการขยายขนาดวิตเจ็ตเมื่อมีการปรับขนาดของหน้าต่างโปรแกรมสามารถกระทำได้ด้วยการระบุพารามิเตอร์ fill ในคำสั่ง pack() ดังนี้
                    tk.X = ให้มีการขยายในแนวนอน
                    tk.Y = ให้มีการขยายในแนวตั้ง
                    tk.BOTH = ให้มีการขยายทั้งแนวนอนและแนวตั้ง

          การกำหนดวิธีการจัดเรียงวิดเจ็ตที่ปกติจะเรียงจากบนลงล่างให้เป็นรูปแบบอื่น สามารถกระทำได้ด้วยการระบุพารามิเตอร์ side ในคำสั่ง pack() ดังนี้
                    tk.LEFT
                    tk.RIGHT
                    tk.TOP
                    tk.BOTTOM

          การกำหนดให้วิดเจ็ตขยายขนาดเต็มพื้นที่ตามกรอบหรือหน้าต่างที่วิดเจ็ตนั้นถูกผสานเข้าสามารถกระทำได้ด้วยการระบุพารามิเตอร์ expand ในคำสั่ง pack() ดังนี้
                    True
                    False

          การกำหนดการจัดเรียงวิดเจ็ตทำได้ด้วยการระบุพารามิเตอร์ fill ในคำสั่ง pack() ดังนี้
                    tk.X = ให้มีการขยายในแนวนอน
                    tk.Y = ให้มีการขยายในแนวตั้ง
                    tk.BOTH = ให้มีการขยายทั้งแนวนอนและแนวตั้ง

          การกำหนดระยะห่างระหว่างขอบวิดเจ็ตกับข้อความภายในวิดเจ็ตทำได้ด้วยการระบุค่าระยะห่างให้กับพารามิเตอร์ ipadx หรือ ipady ในคำสั่งสร้างวิดเจ็ต ดังนี้
                    ipadx = ระยะห่างในแนวนอน
                    ipady = ระยะห่างในแนวตั้ง

ตัวอย่างโปรแกรม ข-2

import tkinter as tk
app = tk.Tk()
app.title("โปรแกรมของฉัน")
label = tk.Label(text="นวัตกรรมคอมพิวเตอร์")
label.pack()
app.mainloop()

ตัวอย่างโปรแกรม ข-3

import tkinter as tk
app = tk.Tk()
app.title("โปรแกรมของฉัน")
app.geometry("320x200")
label = tk.Label(text="นวัตกรรมคอมพิวเตอร์",
                 font=('Tahoma',12),
                 fg='white', bg='blue',
                 width=20, height=2)
label.pack()
app.mainloop()

ค่าสีของ pytk

การกำหนดค่าสีเพื่อใช้กับ pytk นั้นสามารถระบุเป็นชื่อของสีได้แก่ “white” , “red”, “black”, “blue”, “yellow”, “cyan”, “magentar” เป็นต้น

          นอกจากนี้สามารถระบุเป็นค่าสีที่เกิดจากการผสมแม่สีสีแดง สีเขียว และสีน้ำเงินภายใต้รูปแบบของการกำหนดเป็นสตริงของค่าสีดังนี้

“#RRGGBB”

โดยที่
                    RR       เป็นระดับค่าของสีแดงมีค่าเป็น 00 ถึงFF ในเลขฐาน 16
                    GG      เป็นระดับค่าของสีเขียวมีค่าเป็น 00 ถึงFF ในเลขฐาน 16
                    BB        เป็นระดับค่าของสีน้ำเงินมีค่าเป็น 00 ถึงFF ในเลขฐาน 16

การใช้ Button

ขั้นตอนการใช้งานวิดเจ็ตประเภท Button คือ
          1. เตรียมฟังก์ชันสำหรับถูกเรียกใช้เมื่อปุ่มถูกกด
          2. สร้างวัตถุประเภท Button
                    2.1 กำหนดข้อความบนปุ่มผ่านพารามิเตอร์ text
                    2.2 กำหนดฟังก์ชันที่ถูกเรียกใช้เมื่อปุ่มถูกกดผ่านพารามิเตอร์ command
          3. ทำการ pack

การอัพเดตข้อความในวิตเจ็ต

ขั้นตอนการอัพเดตค่าในวิดเจ็ตของ tkinter มีขั้นตอนดังนี้
          1. สร้างวัตถุที่เกิดจากการสร้างด้วย tk.Tk()
          2. สร้างวัตถุจาก tk.StringVar( ชื่อวัตถุจากข้อ1 )
          3. กำหนดค่าด้วย set( ‘ข้อความ’ )
          4. ในการสร้างวิดเจ็ตที่ต้องการให้มีการเปลี่ยนแปลงค่า ให้เปลี่ยนจากการใช้ text เป็น
                    textvariable

หมายเหตุ

          นอกจากนี้ยังมี IntVar(), DoubleVar() และ BooleanVar()

ตัวอย่างโปรแกรม ข-4

import tkinter as tk
def btn_clicked():
    my_str.set("นวัตกรรมคอมพิวเตอร์")
app = tk.Tk()
app.title("โปรแกรมของฉัน")
app.geometry("320x200")
my_str = tk.StringVar(app)
my_str.set("ข้อความ")
label = tk.Label(textvariable=my_str, font=('Tahoma',12),
                 fg='white', bg='blue', width=20, height=2)
btn = tk.Button(text="คลิก", font=('Tahoma',12),
                 command=btn_clicked, width=20, height=2)
label.pack()
btn.pack()
app.mainloop()

ขั้นตอนการอัพเดตค่าในวิดเจ็ตของ tkinter มีขั้นตอนดังนี้
                    1. สร้างวัตถุที่เกิดจากการสร้างด้วย tk.Tk()
                    2. กำหนดพารามิเตอร์ text
                    3. กำหนดค่าด้วย วัตถุ[“text”] = ‘ข้อความ’

ตัวอย่างโปรแกรม ข-5

import tkinter as tk
count = 0
def clicked():
    global count
    count += 1
    lbl_str['text'] = f"{count}"
app = tk.Tk()
lbl_str = tk.Label(app, text="สวัสดี", font=("Tahoma",12))
btn_say = tk.Button(app, text="คลิก", font=("Tahoma",12),
			command=clicked)
lbl_str.pack()
btn_say.pack()
app.mainloop()

การใช้ Entry

ขั้นตอนการใช้งานวิดเจ็ตประเภท Entry คือ
                    1. สร้างวัตถุประเภท Entry
                    2. ทำการ pack
          คำสั่งเข้าถึงข้อความด้วยการสั่งงาน
                    ชื่อของวัตถุ.get()
          คำสั่งลบข้อความ
                    ชื่อวัตถุ.delete(0, tk.END)
          คำสั่งเพิ่มข้อความ
                    ชื่อวัตถุ.insert(0, “ข้อความ”)

ตัวอย่างโปรแกรม ข-6

import tkinter as tk
def btn_clicked():
    my_str.set('สวัสดี'+txt_in.get())
app = tk.Tk()
app.title("โปรแกรมของฉัน")
app.geometry("320x200")
my_str = tk.StringVar(app)
my_str.set("ข้อความ")
label1 = tk.Label(text='กรุณากรอกชื่อ',font=('Tahoma',12))
label = tk.Label(textvariable=my_str,              
			 font=('Tahoma',12),fg='white', bg='blue',
                 width=20, height=2)
btn = tk.Button(text="คลิก", font=('Tahoma',12),
                command=btn_clicked,width=20, height=2)
txt_in = tk.Entry(font=('Tahoma',12),width=20)
label1.pack()
txt_in.pack()
btn.pack()
label.pack()
app.mainloop()

การกำหนด Focus หรือ การให้วิดเจ็ตใดถูกเลือกให้ทำงาน สามารถสั่งงานด้วยคำสั่ง

ชื่อวิดเจ็ต.focus_set()

การเชื่อมเหตุการณ์ Enter เข้ากับวิดเจ็ตมี 2 ขั้นตอน คือ
                    1. เตรียมโปรแกรมย่อยสำหรับตอบสนองเหตุการณ์  ตามรูปแบบนี้

				def  ชื่อโปรแกรมย่อย( x ):
					โค้ดโปรแกรม

                    2. ทำการ bind เหตุการณ์เข้ากับวิดเจ็ตตามรูปแบบของคำสั่ง

				ชื่อวิดเจ็ต.bind( ‘<Return>’, โปรแกรมย่อยจากข้อ1 )

ตัวอย่างโปรแกรมโปรแกรม ข-7

import tkinter as tk
def btn_clicked():
    my_str.set('สวัสดี'+txt_in.get())
    txt_in.focus_set()
    txt_in.delete(0, tk.END)
def txt_in_enter(n):
    btn_clicked()
app = tk.Tk()
app.title("โปรแกรมของฉัน")
app.geometry("320x200")
my_str = tk.StringVar(app)
my_str.set("ข้อความ")
label1 = tk.Label(text='กรุณากรอกชื่อ',font=('Tahoma',12))
label = tk.Label(textvariable=my_str,font=('Tahoma',12),fg='white', bg='blue', width=20, height=2)
btn = tk.Button(text="คลิก", font=('Tahoma',12),command=btn_clicked,width=20, height=2)
txt_in = tk.Entry(font=('Tahoma',12),width=20)
txt_in.bind('<Return>', txt_in_enter)
label1.pack()
txt_in.pack()
btn.pack()
label.pack()
txt_in.focus_set()
app.mainloop()

ตัวอย่างโปรแกรมคำนวณ BMI

ตัวอย่างโปรแกรมการคำนวณค่า BMI (Body Mass Index) เป็นค่าดัชนีมวลกายที่คำนวณจากค่าของน้ำหนักตัว (หน่วยเป็นกิโลกรัม) และส่วนสูง (หน่วยเป็นเมตร)

ดัชนีมวลกาย = น้ำหนักตัว ÷ (ส่วนสูง x ส่วนสูง)

ที่มา https://ddc.moph.go.th/uploads/publish/1064820201022081932.pdf

โปรแกรมโปรแกรม ข-8

import tkinter as tk
def btn_clicked():
    my_str.set("ผลการคำนวณคือ...")
    my_height.focus_set()
def my_weight_enter(x):
    btn.focus_set()
def my_height_enter(x):
    my_weight.focus_set()
app = tk.Tk()
app.title("BMI")
app.geometry("320x240")
my_str = tk.StringVar(app)
my_str.set("???")
label1=tk.Label(text="ส่วนสูง(ซม.):",font=("Tahoma",10),width=15,height=2)
label2=tk.Label(text="น้ำหนัก(กก.):",font=("Tahoma",10),width=15,height=2)
label3=tk.Label(textvariable=my_str,font=("Tahoma",12),width=30,height=2)
btn=tk.Button(text="คำนวณ",font=('Tahoma',10,'bold'), command=btn_clicked,width=20, height=3)
my_weight = tk.Entry(font=("Tahoma",10),width=15)
my_height = tk.Entry(font=("Tahoma",10),width=15)
my_weight.bind('<Return>', my_weight_enter)
my_height.bind('<Return>', my_height_enter)
label1.pack()
my_height.pack()
label2.pack()
my_weight.pack()
btn.pack()
label3.pack()
my_height.focus_set()
app.mainloop()

การใช้ ListBox

          ขั้นตอนการใช้งานวิดเจ็ตประเภท ListBox คือ
                    1. สร้างตัวแปรเก็บรายการที่ถูกเลือกเป็นแบบ StringVar
                    2. สร้างวัตถุประเภท ListBox
                    3. กำหนดพารามิเตอร์ listvariable
                    4. นำรายการใส่ในวัตถุที่ได้จากข้อ 2 ด้วยคำสั่ง
                              insert( tk.END, “ข้อความ”)
                    5. ทำการ pack

          การกำหนดรูปแบบโหมดการเลือก (slectmode)
                    tk.BROWSE
                    tk.SINGLE      
                    tk.MULTIPLE
                    tk.EXTENDED

          การหาค่าตำแหน่งที่เลือก

                    ผลลัพธ์ = วัตถุประเภทListbox.curselection()


          การอ่านข้อความของรายการที่เลือก

                    ผลลัพธ์ = วัตถุประเภทListBox.get( ลำดับที่ต้องการอ่าน )

          หตุการณ์ของ ListBox เรียกว่า ‘<<ListboxSelect>>’ มีหน้าที่เรียกโปรแกรมย่อยเมื่อมีการคลิกเลือกรายการใน Listbox

                    def โปรแกรมย่อย():
                              สิ่งที่ทำ
                    วัตถุListBox.bind( ‘<<ListboxSelect>>’, โปรแกรมย่อย )

ตัวอย่างโปรแกรม ข-9

import tkinter as tk
app=tk.Tk()
app.title("ตัวอย่าง Listbox")
app.geometry("480x240")

def lbox_event(event):
    lbox_str.set(lbox.get(lbox.curselection()))  

lbox_str = tk.StringVar()
list_items = tk.Variable()
lbox = tk.Listbox(app, listvariable=list_items, 	
		width=50,height=11,
		font=('Tahoma',10),selectmode=tk.SINGLE)
lbox.insert(tk.END,"การลาป่วย")
lbox.insert(tk.END,"การลาคลอดบุตร")
lbox.insert(tk.END,"การลาไปช่วยภริยาที่คลอดบุตร")
lbox.insert(tk.END,"การลากิจส่วนตัว")
lbox.insert(tk.END,"การลาพักผ่อน")
lbox.insert(tk.END,"การลาอุปสมบท หรือการลาไปประกอบพิธฮัจย์")
lbox.insert(tk.END,"การลาเข้ารับการตรวจคัดเลือก หรือเข้ารับการเตรียมพล")
lbox.insert(tk.END,"การลาไปศึกษา ฝึกอบรม ดูงาน หรือปฏิบัติการวิจัย")
lbox.insert(tk.END,"การลาไปปฏิบัติงานในองค์การระหว่างประเทศ")
lbox.insert(tk.END,"การลาติดตามคู่สมรส")
lbox.insert(tk.END,"การลาไปฟื้นฟูสมรรถภาพด้านอาชีพ")
lbox.bind('<<ListboxSelect>>', lbox_event)
label = tk.Label(app,textvariable=lbox_str,width=50,height=2)
lbox.pack(ipadx=10,pady=10)
label.pack()
app.mainloop()

การใช้ Scrollbar

          กรณีที่ต้องการเพิ่ม Scrollbar สำหรับแนววตั้งให้กับ Listbox หรือหน้าต่าง
                    1. สร้าง Frame()
                    2. สร้างวัตถุสครอลล์บาร์
                              วัตถุสครอลล์บาร์ = tk.ttk.Scrollbar(
                                        หน้าต่างในข้อ1,
                                        orient=tk.VERTICAL,
                                        command=วัตถุประเภทlistbox.yview)
                                        วัตถุประเภทlistbox[‘yscrollcommand’] = วัตถุสครอลล์บาร์.set
                                        วัตถุสครอลล์บาร์.pack(side=tk.LEFT, expand=True, fill=tk.Y)
                    3. ทำการ pack วัตถุลิสต์บ็อกซ์และสครอลล์บาร์

การใช้ Frame

Frame เป็นวัตถุประเภทกรอบพื้นที่สำหรับใส่วิดเจ็ตประเภท Radiobutton เพื่อจัดเกลุ่มของรายการประเภทเดียวกันให้อยู่ด้วยกัน โดย Frame ที่สร้างใหม่จะต้องอยู่ในหน้าต่างหลักอีกชั้นหนึ่ง

                              วัตถุประเภทเฟรม = tk.Frame( หน้าต่างหลัก )

          เมื่อสร้างวัตถุประเภทเฟรมสำเร็จต้องนำผนวกเข้ากับหน้าต่างหลักด้วย pack()

ตัวอย่างโปรแกรม ข-10

import tkinter as tk
from tkinter import ttk
app=tk.Tk()
app.title("ตัวอย่าง Listbox+Scrollbar")
app.geometry("480x240")

def lbox_event(event):
    lbox_str.set(lbox.get(lbox.curselection()))
    
lbox_str = tk.StringVar()
list_items = tk.Variable()
lbox_Frame = tk.Frame(app)

lbox = tk.Listbox(lbox_Frame, listvariable=list_items,
			width=50,height=4,font=('Tahoma',10), selectmode=tk.SINGLE)

lbox.insert(tk.END, "การลาป่วย")
lbox.insert(tk.END, "การลาคลอดบุตร")
lbox.insert(tk.END, "การลาไปช่วยภริยาที่คลอดบุตร")
lbox.insert(tk.END, "การลากิจส่วนตัว")
lbox.insert(tk.END, "การลาพักผ่อน")
lbox.insert(tk.END, "การลาอุปสมบท หรือการลาไปประกอบพิธฮัจย์")
lbox.insert(tk.END, "การลาเข้ารับการตรวจคัดเลือก หรือเข้ารับการเตรียมพล")
lbox.insert(tk.END, "การลาไปศึกษา ฝึกอบรม ดูงาน หรือปฏิบัติการวิจัย")
lbox.insert(tk.END, "การลาไปปฏิบัติงานในองค์การระหว่างประเทศ")
lbox.insert(tk.END, "การลาติดตามคู่สมรส")
lbox.insert(tk.END, "การลาไปฟื้นฟูสมรรถภาพด้านอาชีพ")
lbox.bind('<<ListboxSelect>>', lbox_event)
label = tk.Label(app, textvariable=lbox_str, width=50,height=2)
lbox.pack( fill=tk.BOTH, expand=True, side=tk.LEFT)

scrollbar=ttk.Scrollbar(lbox_Frame, orient=tk.VERTICAL, command=lbox.yview)
lbox['yscrollcommand'] = scrollbar.set
scrollbar.pack(side=tk.LEFT, expand=True, fill=tk.Y)

lbox_Frame.pack()
label.pack()
app.mainloop()

          การ pack() เข้า Frame

                    1. side=LEFT หมายถึง ใส่วิดเจ็ตเรียงจากซ้ายไปขวา (ปกติจะเป็นบนลงล่าง)
                    2. expand=True หมายถึง ให้ขยายขนาดวิดเจ็ตตามขนาดของ Frame

การใช้ Spinbox

          ขั้นตอนการใช้งานวิดเจ็ตประเภท Spinbox คือ
          1. สร้างตัวแปรประเภท IntVar สำหรับเข้าถึงสถานะของ Spinbox
          2. สร้างวัตถุประเภท Spinbox
                    2.1 กำหนด textvariable เป็นชื่อตามข้อ 1
                    2.2 กำหนดตัวเลขเริ่มต้นใน from_
                    2.3 กำหนดตัวเลขสุดท้ายใน to
                    2.4 กำหนดการเพิ่ม/ลดในแต่ละครั้งที่กดลูกศรใน increment
          3. ทำการ pack

ตัวอย่างโปรแกรม ข-11

import tkinter as tk
app=tk.Tk()
app.title("ตัวอย่าง Spinbox")
app.geometry("320x240")

spin_val = tk.IntVar()
spin_val.set(4) # ค่าเริ่มต้น
spin_box = tk.Spinbox(app,
			textvariable=spin_val,
			from_=0, to=9,
			increment=1)
spin_box.pack()
app.mainloop()

การใช้งาน Checkbutton

ขั้นตอนการใช้งานวิดเจ็ตประเภท Checkbutton คือ
                    1. สร้างตัวแปรประเภท IntVar สำหรับเข้าถึงสถานะของ Checkbutton
                    2. สร้างวัตถุประเภท Checkbutton
                              2.1 กำหนดข้อความใน text
                              2.2 กำหนด variable เป็นชื่อตามข้อ 1
                              2.3 กำหนดความกว้างและความสูงด้วย width และ height
                              2.4 กำหนดค่าของสถานะ onvalue และ offvalue ได้
                              2.5 สามารถกำหนดให้วิดเจ็ตทำงานหรือไม่ด้วยการกำหนด DISABLED แก่ state หรือกำหนดเป็น ACTIVE เพื่อให้วิดเจ็ตทำงาน
                    3. ทำการ pack
          การกลับค่าสถานะของกล่องสามารถใช้คำสั่ง toggle()

ตัวอย่างโปรแกรม ข-12

import tkinter as tk
app = tk.Tk()
app.title("ตัวอย่าง checkbutton")
app.geometry("320x240")
def cbx_clicked():
    msg.set(str(cb1_value.get())+" "+str(cb2_value.get()))
cb1_value = tk.IntVar()
cb2_value = tk.IntVar()
msg = tk.StringVar()
msg.set(str(cb1_value.get())+" "+str(cb2_value.get()))
label = tk.Label(app, textvariable=msg, width=40, height=2,font=("Tahoma",10))
chbx1 = tk.Checkbutton(app, command=cbx_clicked, variable=cb1_value,
			onvalue=1, offvalue=0, width=40, height=2,
			text="สำเนาทะเบียนบ้าน", font=("Tahoma",10))
chbx2 = tk.Checkbutton(app, command=cbx_clicked,variable=cb2_value,
			onvalue=1, offvalue=0, width=40, height=2,
			text="สำเนาบัตรประชาชน", font=("Tahoma",10))
chbx1.pack()
chbx2.pack()
label.pack()
app.mainloop()

การใช้งาน Radiobutton

ขั้นตอนการใช้งานวิดเจ็ตประเภท Radiobutton คือ
                    1. สร้างเฟรมสำหรับ Radiobutton
                    2. สร้างตัวแปรประเภท IntVar
                    3. เตรียมฟังก์ชันสำหรับเรียกทำงานเมื่อคลิกที่ Radiobutton
                    4. สร้างวัตถุประเภท Radiobutton
                              4.1 กำหนดข้อความของรายการผ่านทางพารามิเตอร์ text
                              4.2 กำหนดตัวแปรเก็บผลลัพธ์ด้วย variable
                              4.3 กำหนดค่าของปุ่มด้วย value
                              4.4 กำหนดให้เรียกใช้โปรแกรมย่อยเมื่อคลิกด้วย command
                    5. ทำการ pack เข้ากับวัตถุประเภทเฟรม โดยสามารถกำหนดรูปแบบการวางในเฟรมด้วยการกำหนด anchor เป็น tk.W, tk.E, tk.N หรือ tk.S

ตัวอย่างโปรแกรม ข-13

import tkinter as tk
app = tk.Tk()
app.title("ตัวอย่าง Radiobutton")
app.geometry("320x240")
frame = tk.Frame(app)
def sel():
    label.config(text=str(choice.get()))   
choice = tk.IntVar()
label = tk.Label(app, width=40, height=2,font=("Tahoma",10))
rd1 = tk.Radiobutton(frame,variable=choice, value=1, command=sel, text="เด็กเล็ก")
rd2 = tk.Radiobutton(frame,variable=choice, value=2, command=sel, text="ประถม")
rd3 = tk.Radiobutton(frame,variable=choice, value=3, command=sel, text="มัธยมต้น")
rd1.select()
label.config(text=str(choice.get()))
rd1.pack(anchor = tk.W) # ชิดซ้าย
rd2.pack(anchor = tk.W)
rd3.pack(anchor = tk.W)
frame.pack()
label.pack()
app.mainloop()
  • สามารถเข้าถึงข้อมูลที่ถูกเลือกด้วย get()
  • สามารถลดการสร้างตัวแปรเพื่ออัพเดต label ได้ด้วยการเรียก
                        config( text=”ข้อความ”)

การจัดหน้าจอ

          ก่อนหน้านี้ได้กล่าวถึงการจัดหน้าจอประเภท pack() อันเป็นการนำวิดเจ็ตนำไปเรียงต่อกันจากบนลงล่าง แต่ใน tkinter นั้นมีวิธีการจัดการหน้าจออีก 2 แบบ คือ
                    .grid() สำหรับการจัดหน้าจอด้วยการแบ่งหน้าจอเป็นช่อง และกำหนดให้วิดเจ็ตอยู่ในช่องใด
                    .place() สำหรับกำหนดพิกัด (x,y) ให้กับวิดเจ็ตโดยตรง แต่ด้วยความแตกต่างของระบบแสดงผลของแต่ละระบบปฏิบัติการทำให้วิธีการนี้ไม่เหมาะสมกับการเขียนโปรแกรมเพื่อใช้ข้ามระบบ

          พารามิเตอร์ของ grid() มีดังนี้
                    1. row=หมายเลขแถวที่ต้องการนำวิดเจ็ตไปวาง
                    2. col=หมายเลขคอลัมน์ที่ต้องการนำวิดเจ็ตไปวาง
                    3. columnspand=จำนวนคอลัมน์ที่ต้องการนำมาผสานกันเพื่อแสดงวิดเจ็ต
                    4. sticky=”ทิศที่ยึด”
                              n, s, e และ w แทนการยึดวิเจ็ตเข้ากับบน ล่าง ซ้าย และขวา หรือ

                              ใช้ tk.N, tk.S, tk.E และ tk.W แทนข้อความ
                    5. pady=ระยะห่างระหว่างวิดเจ็ตในแนวตั้ง
                    6. padx=ระยะห่างระหว่างวิดเจ็ตในแนวนอน

.grid().pack()
stick=”ns”fill=tk.Y
stick=”ew”fill=tk.X
stick=”nsew”fill=tk.BOTH

สรุป

จากบทความนี้จะพบว่าการใช้ GUI ในภาษาไพธอนสามารใช้ PyTk ที่ติดตั้งไม่ยาก และการใช้งานไม่ซับซ้อน แต่ผู้เขียนโปรแกรมจะต้องออกแบบโครงสร้างการแสดงผลบนหน้าจอก่อนเขียนโค้ดจึงจะทำให้เขียนโค้ดได้ง่ายและรวดเร็วการเขียนไปพร้อมกับการปรับแก้ไป

นอกจาก PyTk แล้วยังมี GUI อีกหลายตัวให้เลือกใช้ เช่น PyQt, PySide, PyWx หรือ PyGTK เป็นต้น ซึ่งมีวิธีและแนวคิดในการเขียนโค้ดที่แตกต่างกันไป สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020-2023, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ

ปรับปรุงเมื่อ 2023-07-04