φυβλαςのβλογ
phyblas的博客



pyqt เบื้องต้น บทที่ ๑๗: การสร้างและใช้งานกล่องเด้งแสดงข้อความ
เขียนเมื่อ 2021/08/19 07:34
แก้ไขล่าสุด 2021/09/28 16:42

ต่อจาก บทที่ ๑๖

ในบทนี้จะเป็นเรื่องของการสร้างใช้ 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 เท่านั้นที่จะต่างจากตัวอื่น คือจะใช้แค่ให้ขึ้นข้อความมา ไม่สามารถกดปุ่มเพื่อเลือกได้



อ่านบทถัดไป >> บทที่ ๑๘





-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> pyqt

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ