ต่อจาก
บทที่ ๙
ในบทที่แล้วได้พูดถึงกล่องป้อนข้อความไปแล้ว สำหรับบทนี้จะพูดถึง widget อีกตัวที่มักใช้งานบ่อยใน GUI นั่นคือ QCheckBox ซึ่งเป็นช่องติ๊กที่เอาไว้ติ๊กเลือกว่าจะเอาหรือไม่เอา
การสร้างช่องติ๊ก {QCheckBox}
การสร้าง QCheckBox นั้นคล้ายกับ QLabel คือจะมีข้อความตัวหนังสืออยู่ด้วย แค่จะมีช่องสี่เหลี่ยมให้ติ๊กโผล่ขึ้นมาทางซ้ายให้ติ๊กได้
ลองสร้างช่องติ๊กเปล่าๆขึ้นมาดูเป็นตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox
qAp = QApplication(sys.argv)
natang = QWidget()
chongtick = QCheckBox('เอา',natang) # สร้างช่องติ๊ก
chongtick.move(20,20)
natang.show()
qAp.exec_()
ก็จะได้ช่องแบบนี้ที่กดติ๊กได้
การตั้งสถานะติ๊ก {.setChecked}
ปกติช่องที่เริ่มสร้างขึ้นมาจะเป็นสี่เหลี่ยมเปล่าที่ไม่ได้ติ๊ก ถ้าจะตั้งสถานะติ๊กสามารถทำได้โดยเมธอด .setChecked โดยถ้าใส่ True จะทำให้อยู่ในสถานะถูกติ๊ก ถ้า False ก็จะไม่ถูกติ๊ก
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox
qAp = QApplication(sys.argv)
natang = QWidget()
chongtick1 = QCheckBox('ooo',natang)
chongtick1.setChecked(True) # ตั้งให้ติ๊ก
chongtick1.move(10,10)
chongtick2 = QCheckBox('oxo',natang)
chongtick2.setChecked(False) # ตั้งให้ไม่ติ๊ก
chongtick2.move(10,40)
natang.show()
qAp.exec_()
จะได้กล่องบนถูกติ๊กอยู่ และกล่องล่างไม่ถูกติ๊กอยู่
ลองดูอีกตัวอย่าง เช่นสร้างปุ่มที่กดแล้วทำให้เกิดการเลือกติ๊กทั้งหมดได้
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
chongtick1 = QCheckBox('soba',natang)
chongtick1.move(10,10)
chongtick2 = QCheckBox('ramen',natang)
chongtick2.move(70,10)
chongtick3 = QCheckBox('udon',natang)
chongtick3.move(130,10)
def tickmot():
chongtick1.setChecked(True)
chongtick2.setChecked(True)
chongtick3.setChecked(True)
pumkot = QPushButton('zenbu',natang)
pumkot.move(10,40)
pumkot.clicked.connect(tickmot)
natang.show()
qAp.exec_()
พอกดปุ่มด้านล่าง ช่องติ๊กทั้ง ๓ ด้านบนก็จะถูกติ๊กทั้งหมด
การเปลี่ยนสลับสถานะติ๊ก {.toggle}
ในขณะที่ถ้าใช้เมธอด .setChecked จะเป็นการกำหนดชัดว่าให้เปลี่ยนสถานะเป็นติ๊กหรือไม่ติ๊ก แต่หากต้องการให้สลับจากติ๊กเป็นไม่ติ๊ก สลับจากไม่ติ๊กเป็นติ๊ก เหมือนเวลาที่เราไปกดช่องติ๊กโดยทั่วไป แบบนี้ให้ใช้เมธอด .toggle
ตัวอย่างเช่น
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
chongtick1 = QCheckBox('ก',natang)
chongtick1.move(10,10)
chongtick2 = QCheckBox('ข',natang)
chongtick2.setChecked(True)
chongtick2.move(70,10)
chongtick3 = QCheckBox('ค',natang)
chongtick3.move(130,10)
def tickmot():
chongtick1.toggle()
chongtick2.toggle()
chongtick3.toggle()
pumkot = QPushButton('@@@',natang)
pumkot.move(50,40)
pumkot.clicked.connect(tickmot)
natang.show()
qAp.exec_()
จะได้หน้าต่างที่มีช่องติ๊ก ๓ ช่องแบบนี้ ลองกดปุ่มด้านล่างก็จะเป็นการเปลี่ยนสถานะของทั้ง ๓ ปุ่มไปพร้อมกัน
การทำคำสั่งเมื่อถูกติ๊ก {.toggled}
หากมีฟังก์ชันที่ต้องการให้ทำงานเมื่อช่องติ๊กถูกติ๊กก็ให้ใช้เมธอด .toggled
อนึ่ง .toggled กับ .toggle เขียนคล้ายกัน แค่เพิ่มตัว d เข้ามา ระวังสับสน
ตัวอย่าง ลองให้ขึ้น !!! เมื่อมีการติ๊ก
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox
qAp = QApplication(sys.argv)
natang = QWidget()
chongtick = QCheckBox('!!!!',natang)
chongtick.move(10,10)
chongtick.toggled.connect(lambda: print('!!!'))
natang.show()
qAp.exec_()
การดูว่าช่องนั้นถูกติ๊กอยู่หรือไม่ {.isChecked}
สามารถใช้เมธอด isChecked เมื่อต้องการจะตรวจดูสถานะว่าช่องติ๊กนั้นถูกติ๊กอยู่หรือไม่
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox
qAp = QApplication(sys.argv)
natang = QWidget()
def tickyumai():
if(chongtick.isChecked()):
print('ติ๊กอยู่')
else:
print('ไม่ติ๊กแล้ว')
chongtick = QCheckBox('ติ๊กต๊อก',natang)
chonttick.setStyleSheet('background-color: #9fe; font-family: Tahoma')
chongtick.move(10,10)
chongtick.toggled.connect(tickyumai)
natang.show()
qAp.exec_()
การตั้งให้แก้ติ๊กไม่ได้ {.setCheckable}
หากต้องการให้ช่องนั้นติ๊กไม่ได้ก็อาจใช้เมธอด .setCheckable ตั้งเป็น False
เช่นลองสร้างช่องติ๊กขึ้นมา ๒ ช่อง ให้ช่องซ้ายแก้ติ๊กได้เมื่อช่องขวาติ๊กอยู่เท่านั้น
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QCheckBox
qAp = QApplication(sys.argv)
natang = QWidget()
chongtick1 = QCheckBox('T_T',natang)
chongtick1.move(10,10)
chongtick1.setCheckable(False)
def tickla():
chongtick1.setCheckable(chongtick2.isChecked())
chongtick2 = QCheckBox('^_^',natang)
chongtick2.move(80,10)
chongtick2.toggled.connect(tickla)
natang.show()
qAp.exec_()
ก็จะได้ช่องแบบนี้ ลองติ๊กช่องซ้ายโดยยังไม่ได้ติ๊กช่องขวา จะพบว่าไม่เกิดอะไรขึ้น
นอกจากนี้ยังอาจใช้เมธอด .setEnabled แทนก็ได้เพื่อให้ทำงานไม่ได้ แต่เมธอดนี้จะทำให้กล่องข้อความเปลี่ยนสีไปให้เห็นแยกได้ชัดว่าอยู่ในสถานะที่ใช้งานไม่ได้ ดังนั้นถ้าต้องการให้เห็นสถานะของกล่องชัดเจนก็ใช้ .setEnabled แทน .setCheckable น่าจะดีกว่า
สรุปท้ายบท
ในบทนี้ได้เขียนถึงการสร้างและใช้งานช่องติ๊กไปแล้ว ในบทต่อไปจะถูกถึง widget อีกตัวที่คล้ายๆกัน นั่นคือ QRadioButton
อ่านบทถัดไป >>
บทที่ ๑๑