ต่อจาก
บทที่ ๑๖
ในบทนี้จะเป็นเรื่องของการสร้างใช้ QMessageBox
ซึ่งเป็นหน้าต่างที่เด้งขึ้นมาชั่วคราวเพื่อบอกเตือนอะไรบางอย่างกับผู้ใช้
QMessageBox ชนิดต่างๆ
คลาสของกล่องเด้งแสดงข้อความคือ QMessageBox ซึ่งยังแบ่งเป็นหลายชนิด ดังนี้
|
ปุ่มตั้งต้น |
ภาพประกอบ |
ค่าคืนกลับ |
QMessageBox.about |
ok |
ไม่มี |
None |
QMessageBox.question |
yes / no |
|
ปุ่มที่กด |
QMessageBox.warning |
ok |
|
ปุ่มที่กด |
QMessageBox.critical |
ok |
|
ปุ่มที่กด |
QMessageBox.information |
ok |
|
ปุ่มที่กด |
ข้อแตกต่างระหว่างแต่ละชนิดอยู่ที่ภาพและปุ่มที่ปรากฏขึ้นมาบนกล่อง โดยอาจแยกใช้ต่างกันไปตามจุดประสงค์ที่จะใช้
เพียงแต่ว่าความต่างของปุ่มในที่นี้เป็นแค่ค่าตั้งต้น สามารถปรับเปลี่ยนปุ่มที่จะให้ปรากฏในกล่องข้อความได้
การสร้างกล่องเด้งแสดงข้อความนั้นโดยทั่วไปแล้วไม่ว่าจะชนิดไหนก็อาจเขียนแบบนี้
QMessageBox.ชนิดข้อความ(widget_หลัก,ไตเติล,ข้อความที่ต้องการบอก)
ส่วนไตเติลนั้นจะแสดงอยู่ที่หัวหน้าต่าง คล้ายกับเมื่อใช้ .setWindowTitle ให้หน้าต่างหลัก
เพียงแต่ว่าถ้าเป็นใน mac จะไม่มีการแสดงไตเติลของกล่องเด้งแสดงข้อความ ดังนั้นแม้จะใส่ไปก็ไม่เกิดอะไรขึ้น
ในที่นี้ก็จะขอเว้นว่างไว้ ใส่เป็นสายอักขระเปล่า
''
การสร้างกล่องบอกข้อมูล {QMessageBox.about}
ขอเริ่มยกตัวอย่างจาก QMessageBox.about ซึ่งมักใช้เวลาที่มีข้อมูลบางอย่างที่ต้องการบอกกับผู้ใช้
หากต้องการให้ QMessageBox ปรากฏขึ้นมาทันทีเมื่อเปิดหน้าต่างหลักมาก็อาจเขียนได้ดังนี้
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 18px;')
QMessageBox.about(natang,'','หน้าต่างนี้ว่างเปล่า\nเปิดไปก็เท่านั้น')
natang.show()
qAp.exec_()
จากนั้นพอรันแล้วหน้าต่างหลักก็จะขึ้นมา แล้วตามด้วยกล่องเด้งแสดงข้อความดังที่ตั้งไว้
จะเห็นว่ากล่องเด้งแสดงข้อความนี้จะคล้ายกับหน้าต่างหลัก แต่ไม่สามารถกดย่อซ่อนหรือขยายหน้าต่างได้ ได้แค่กดปิด หรือกด ok
ไปเท่านั้น
หากต้องการให้เด้งขึ้นมาตามเงื่อนไขบางอย่าง เช่นให้เด้งขึ้นมาเมื่อกดปุ่มก็อาจเขียนดังนี้
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 17px')
def deng():
QMessageBox.about(natang,'','ไม่บอก')
pumkot = QPushButton('ดูข้อมูล',natang)
pumkot.setGeometry(10,10,120,50)
pumkot.clicked.connect(deng)
natang.show()
qAp.exec_()
ก็จะได้หน้าต่างที่มีปุ่ม พอกดแล้วก็จะมีกล่องเด้งขึ้นมาแบบนี้
กล่องข้อความที่เด้งขึ้นจาก QMessageBox.about นั้นจะมีแต่ข่้อความขึ้นมา ไม่มีรูปประกอบ และจะไม่คืนค่าปุ่มที่ถูกกด
การสร้างกล่องคำถาม {QMessageBox.question}
QMessageBox.question นั้นใช้เวลาที่ต้องการให้เด้งขึ้นมาเพื่อถามยืนยันอะไรบางอย่างกับผู้ใช้ โดยจะมีปุ่มให้เลือก yes กับ
no
ซึ่งทำให้ได้ผลต่างไปตามคำตอบได้
ตัวอย่างเช่น ลองสร้างปุ่มสำหรับกดแล้วปิด แต่ก่อนจะปิดให้ขึ้นกล่องข้อความยืนยันว่าจะให้ปิดจริงๆหรือ
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 20px')
def chapitla():
# สร้างกล่องเด้งขึ้นมาเตือนว่าจะปิดแน่หรือ โดยรอเอาคำตอบ yes/no
lueak = QMessageBox.question(natang,'','จะปิดแน่เหรอ')
if(lueak==QMessageBox.Yes): # ถ้ากด Yes จึงจะให้ปิด
natang.close()
pumkot = QPushButton('ปิดทิ้ง',natang)
pumkot.setGeometry(10,10,80,30)
pumkot.setStyleSheet('background-color: #aff')
pumkot.clicked.connect(chapitla)
natang.show()
qAp.exec_()
จะได้หน้าต่างแบบนี้ที่พอกดปุ่มแล้วก็จะขึ้นมาให้ยืนยันว่าจะปิดจริงๆหรือไม่ ถ้ากด yes ก็จะปิดไป ถ้ากด no
ก็ไม่มีอะไรเกิดขึ้น
ปุ่มที่กดนั้นจะเป็นค่าคืนกลับเมื่อใช้ QMessageBox.question โดยค่าที่ได้มานี้จะเป็นแฟล็กของปุ่มที่ถูกเลือกมา
เอามาใช้เป็นเงื่อนไขว่าจะให้ทำยังไงต่อไปได้
สำหรับแฟล็กของปุ่มนั้นก็ได้แก่ QMessageBox.Yes คือปุ่ม yes และ QMessageBox.No คือปุ่ม no เป็นต้น
ในที่นี้ถ้าปุ่มที่กดนั้นตรงกับ QMessageBox.Yes จึงจะสั่ง .close() ให้หน้าต่างปิดไป แต่ถ้ากด QMessageBox.No
ก็จะไม่เกิดอะไรขึ้น
การกำหนดปุ่มที่จะใส่ตามที่ต้องการ
QMessageBox.question นั้นโดยค่าตั้งต้นแล้วจะมีแค่ปุ่ม yes กับ no แต่ก็สามารถกำหนดปุ่มที่จะใส่ลงไปเพิ่มเติมได้
โดยใส่อาร์กิวเมนต์ตัวที่ ๔ และ ๕ ตาม
QMessageBox.question(widget_หลัก,ไตเติล,คำถาม,ปุ่มที่จะใส่,ปุ่มหลัก)
ในที่นี้ปุ่มหลักก็คือปุ่มที่แนะนำให้กดเป็นพิเศษ ซึ่งปกติแล้วถ้ากด enter ก็จะเป็นการเลือกปุ่มนั้นไปด้วย
โดยค่าตั้งต้นแล้ว สำหรับ QMessageBox.question นั้นปุ่มหลักจะเป็นปุ่ม no
ถ้าจะใส่ปุ่มอะไรลงไปให้เอาแต่ละปุ่มมาเรียงกันโดยคั่นด้วย |
ตัวอย่างเช่นลองใส่ปุ่มไป ๔ ปุ่ม แล้วตั้งว่าถ้ากดปุ่ม QMessageBox.Open ก็จะขึ้น QMessageBox.about มาว่า "ถูกต้อง"
นอกนั้นให้ขึ้นว่า "ตอบผิด"
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma')
def dukhamtham():
# กำหนดปุ่มตัวเลือก ๔ ตัวที่จะใส่
tualueak = QMessageBox.Close|QMessageBox.Open|QMessageBox.Save|QMessageBox.Reset
# สร้างกล่องข้อความ รอเอาคำตอบ
lueak = QMessageBox.question(natang,'','คำว่า "เปิด" ภาษาอังกฤษใช้คำว่าอะไร',tualueak,QMessageBox.Open)
if(lueak==QMessageBox.Open): # ถ้าเลือก open จึงให้ขึ้นว่า "ถูกต้อง"
QMessageBox.about(natang,'','ถูกต้อง')
else:
QMessageBox.about(natang,'','ตอบผิด')
pumkotdu = QPushButton('ดูคำถาม',natang)
pumkotdu.clicked.connect(dukhamtham)
natang.show()
qAp.exec_()
พอรันแล้วก็จะขึ้นคำถามมาพร้อม ๔ ปุ่มแบบนี้ให้เลือก ลองกดเลือกแล้วดูความแตกต่างได้
การสร้างกล่องเตือนให้ระวัง {QMessageBox.warning}
QMessageBox.warning นั้นมักจะใช้เมื่อต้องการให้ขึ้นข้อความขึ้นมาเพื่อเตือนให้ระวังอะไรบางอย่าง
โดยสามารถกำหนดปุ่มที่จะให้ปรากฏได้ คล้ายกับ QMessageBox.question เพียงแต่ต่างกันตรงที่โดยค่าตั้งต้นแล้วจะมีแต่ปุ่ม
close ให้เลือกปุ่มเดียว
ลองสร้างให้พอจะกดปิดก็ขึ้นเตือนมาโดยมีปุ่ม close กับ cancel ถ้ากด close จึงจะปิดไปจริงๆ
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-style: italic')
def kotpit():
lueak = QMessageBox.warning(natang,'','จะปิดเลยจริงๆเหรอ',QMessageBox.Close|QMessageBox.Cancel,QMessageBox.Close)
if(lueak==QMessageBox.Close):
natang.close()
pumkot = QPushButton('กดเพื่อปิด',natang)
pumkot.clicked.connect(kotpit)
natang.show()
qAp.exec_()
การสร้างกล่องเตือนเรื่องสำคัญเป็นพิเศษ {QMessageBox.critical}
QMessageBox.critical จะคล้ายกับ QMessageBox.warning แค่มักใช้กับเรื่องที่สำคัญมากยิ่งกว่า
เช่นอะไรที่อาจเกี่ยวพันถึงความเป็นความตาย
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; color: red')
def tuean():
lueak = QMessageBox.critical(natang,'','หยุดเดี๋ยวนี้นะ!',QMessageBox.Ok|QMessageBox.Ignore,QMessageBox.Ok)
if(lueak==QMessageBox.Ignore):
natang.close()
pumkotdu = QPushButton('อย่ากดเลยนะ',natang)
pumkotdu.setFixedSize(150,60)
pumkotdu.clicked.connect(tuean)
natang.show()
qAp.exec_()
ก็จะได้หน้าต่างที่มีปุ่มที่ดูไม่น่ากดแบบนี้ แต่ถ้ากดก็จะขึ้นกล่องเด้งข้อความขึ้นมาเตือน
การสร้างกล่องให้ข้อมูล {QMessageBox.Information}
ตัวสุดท้ายที่จะแนะนำในที่นี้คือ QMessageBox.Information ซึ่งจริงๆแล้วก็คล้ายกับ QMessageBox.question
QMessageBox.warning QMessageBox.critical คือจะขึ้นข้อความขึ้นมา แต่มักใช้ในกรณีที่แค่ต้องการบอกข้อมูล
ไม่ได้มีเรื่องใหญ่โตอะไร และถ้าต้องการจะสร้างหลายปุ่มให้เลือกก็สามารถทำได้
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; color: blue')
def tuean():
QMessageBox.information(natang,'','บอสหลับอยู่\nไว้มาใหม่นะ')
natang.close()
pumkotdu = QPushButton('สู้บอส',natang)
pumkotdu.clicked.connect(tuean)
natang.show()
qAp.exec_()
สรุปท้ายบท
ในบทนี้ได้แนะนำการใช้ QMessageBox เพื่อสร้างกล่องเด้งแสดงข้อความชนิดต่างๆไป
ที่จริงแล้วความแตกต่างของ QMessageBox.question QMessageBox.warning QMessageBox.critical QMessageBox.Information
นั้นอยู่ที่ปุ่มตั้งต้น และรูปไอคอนที่โผล่มาพร้อมกับข้อความเท่านั้น นอกจากนั้นก็เหมือนกัน
ถ้ากำหนดปุ่มตามที่ต้องการลงไปก็ให้ผลไม่ต่างกัน อาจใช้แทนกันได้
เพียงแต่ว่า QMessageBox.about เท่านั้นที่จะต่างจากตัวอื่น คือจะใช้แค่ให้ขึ้นข้อความมา
ไม่สามารถกดปุ่มเพื่อเลือกได้
อ่านบทถัดไป >>
บทที่ ๑๘