ต่อจาก
บทที่ ๑๓
ในบทนี้จะแนะนำ widget ที่เอาไว้ใช้ปรับค่าวันที่และเวลา นั่นคือ QDateTimeEdit, QDateEdit และ QTimeEdit
การสร้างช่องปรับวันที่และเวลา {QDateTimeEdit QDateEdit QTimeEdit}
QDateTimeEdit QDateEdit QTimeEdit นั้นต่างก็มีไว้ใช้เพื่อปรับค่าวันที่และเวลา
ข้อแตกต่างคือ QDateTimeEdit เป็นช่องปรับทั้งวันที่และเวลา QDateEdit เป็นช่องปรับแค่วันที่ QTimeEdit เป็นช่องปรับแค่เวลา
ขอเริ่มแสดงตัวอย่างการใช้งานโดยลองสร้างทั้ง widget ทั้ง ๓ ชนิดนี้ขึ้นมาแสดงในที่นี้ดู
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QDateTimeEdit,QDateEdit,QTimeEdit,QVBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
vbl = QVBoxLayout()
natang.setLayout(vbl)
# ช่องปรับวันที่กับเวลา
wanwela = QDateTimeEdit()
vbl.addWidget(wanwela)
# ช่องปรับแค่วันที่
wanthi = QDateEdit()
vbl.addWidget(wanthi)
# ช่องปรับแค่เวลา
kimong = QTimeEdit()
vbl.addWidget(kimong)
natang.show()
qAp.exec_()
ก็จะได้ออกมาแบบนี้
ก็จะได้ช่องทั้ง ๓ แบบออกมาดังนี้
ซึ่งจะเห็นว่าค่าตั้งต้นหากไม่ได้กำหนดอะไรก็จะเป็น 2000/01/01 เวลา 0.00 น. แต่หากต้องการเปลี่ยนค่าตั้งต้นก็ทำได้
การตั้งวันที่และเวลา {QDatetime QDate QTime}
การปรับวันที่หรือเวลาทำได้โดยใช้เมธอด .setDateTime .setDate .setTime โดยสิ่งที่ต้องใส่ลงไปคือออบเจ็กต์ชนิด QDatetime
QDate QTime ตามลำดับ ซึ่งแต่ละตัวนั้นเรียกใช้ได้จากใน PyQt5.QtCore
ออบเจ็กต์ทั้ง ๓ นี้เวลาสร้างขึ้นใส่อาร์กิวเมนต์ดังนี้
QDateTime(ปี,เดือน,วัน,ชั่วโมง,นาที)
QDate(ปี,เดือน,วัน)
QTime(ชั่วโมง,นาที)
นอกจากนี้ยังสามารถใส่เวลาละเอียดถึงหน่วยวินาทีลงไปได้โดยใส่คีย์เวิร์ด second และมิลลิวินาทีได้เป็น msec แต่ในที่นี้จะขอพูดถึงหลักนาทีขึ้นไปเท่านั้นก็พอ
ตัวอย่างการใช้
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QDateTimeEdit,QDateEdit,QTimeEdit,QVBoxLayout
from PyQt5.QtCore import QDateTime,QDate,QTime
qAp = QApplication(sys.argv)
natang = QWidget()
vbl = QVBoxLayout()
natang.setLayout(vbl)
# ช่องปรับวันที่กับเวลา
wanwela = QDateTimeEdit()
vbl.addWidget(wanwela)
wanwela.setDateTime(QDateTime(2021,8,16,20,30)) # ตั้งวันที่และเวลา
# ช่องปรับแค่วันที่
wanthi = QDateEdit()
vbl.addWidget(wanthi)
wanthi.setDate(QDate(2021,8,17)) # ตั้งวันที่
# ช่องปรับแค่เวลา
kimong = QTimeEdit()
vbl.addWidget(kimong)
kimong.setTime(QTime(19,45)) # ตั้งเวลา
natang.show()
qAp.exec_()
ก็จะได้ค่าเวลาตามที่ตั้งเอาไว้แบบนี้
การเอาค่าวันที่และเวลาจากในช่อง {.dateTime .date .time}
หากต้องการจะเอาค่าวันที่หรือเวลาที่อยู่ในกล่องปรับก็อาจใช้เมธอด .dateTime .date .time
โดย .date จะได้เป็นออบเจ็กต์ QDate ซึ่งมีเมธอด .day .month .year ไว้แสดงค่าวันเดือนปี
ส่วน .time จะได้ออบเจ็กต์ QTime ซึ่งใช้เมธอด .hour .minute ในการแสดงชั่วโมงและนาที
ตัวอย่าง ลองทำให้เมื่อกดปุ่มแล้วเอาค่าวันเวลาที่เลือกไว้มาแสดง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QDateTimeEdit,QVBoxLayout,QPushButton,QLabel
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 18px')
vbl = QVBoxLayout()
natang.setLayout(vbl)
wanwela = QDateTimeEdit()
vbl.addWidget(wanwela)
khokhwam = QLabel('--')
vbl.addWidget(khokhwam)
pumkot = QPushButton('แสดงเวลา')
vbl.addWidget(pumkot)
def khian():
print(wanwela.dateTime())
wanthi = wanwela.date()
wela = wanwela.time()
wan = wanthi.day()
duean = wanthi.month()
pi = wanthi.year()
chuamong = wela.hour()
nathi = wela.minute()
khokhwam.setText('วันที่ %d เดือน %d ปี %d\nเวลา %02d:%02d'%(wan,duean,pi,chuamong,nathi))
pumkot.clicked.connect(khian)
natang.show()
qAp.exec_()
ก็จะได้หน้าต่างแบบนี้ซึ่งพอลองกดปุ่มก็จะขึ้นข้อความตามวันเวลาที่เลือกในช่อง
การทำคำสั่งเมื่อมีการเปลี่ยนแปลงวันและเวลา {.dateTimeChanged .dateChanged
.timeChanged}
หากต้องการให้เกิดการทำอะไรเมื่อมีการเปลี่ยนแปลงวันหรือเวลาในช่องปรับวันที่และเวลาก็ตั้งได้ที่ .dateTimeChanged หรือ
.dateChanged หรือ .timeChanged
.dateChanged จะทำงานเมื่อวันที่ถูกปรับ และได้พารามิเตอร์เป็นวันที่ใหม่ ส่วน .timeChanged จะทำงานเมื่อเวลาถูกปรับ
และได้พารามิเตอร์เป็นเวลาใหม่
ตัวอย่างเช่นลองสร้างช่องปรับวันที่และช่องปรับเวลา แล้วตั้งให้พอมีการเปลี่ยนแปลงก็พิมพ์แสดงข้อความออกมา
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QDateEdit,QTimeEdit,QVBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 18px')
vbl = QVBoxLayout()
natang.setLayout(vbl)
def khianwanthi(wanthi):
wan = wanthi.day()
duean = wanthi.month()
pi = wanthi.year()
print('วันที่ %d เดือน %d ปี %d'%(wan,duean,pi))
chongwanthi = QDateEdit()
vbl.addWidget(chongwanthi)
chongwanthi.dateChanged.connect(khianwanthi)
def khianwela(wela):
chuamong = wela.hour()
nathi = wela.minute()
print('เวลา %02d:%02d'%(chuamong,nathi))
chongwela = QTimeEdit()
vbl.addWidget(chongwela)
chongwela.timeChanged.connect(khianwela)
natang.show()
qAp.exec_()
ก็จะได้หน้าต่างแบบนี้ออกมา ซึ่งถ้าลองกดปรับวันที่หรือเวลาก็จะมีการพิมพ์ข้อความออกมา
การแสดงปฏิทิน {.setCalendarPopup}
หากต้องการให้ขึ้นปฏิทินเวลาที่จะเลือกวันที่ก็สามารถตั้ง .setCalendarPopup ให้เป็น True
จากนั้นทางขวาก็จะมีปุ่มที่พอกดแล้วปฏิทินจะขึ้นมาให้เลือก
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QDateTimeEdit,QHBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
hbl = QHBoxLayout()
natang.setLayout(hbl)
wanwela = QDateTimeEdit()
hbl.addWidget(wanwela)
wanwela.setCalendarPopup(True) # ตั้งให้แสดงปฏิทิน
natang.show()
qAp.exec_()
พอกดปุ่มก็จะได้ปฏิทินออกมาแบบนี้ ใช้คลิกเลือกวันที่ได้ โดยภาษาที่ขึ้นก็ขึ้นอยู่กับ locale ของเครื่องที่ตั้งไว้
ซึ่งในที่นี้เป็นภาษาจีนเพราะใช้เครื่องภาษาจีนอยู่ แต่หากต้องการจะเปลี่ยนภาษาก็ทำได้โดยการปรับ locale
การปรับ locale ในปฏิทิน {.calendarWidget .setLocale}
การตั้ง locale ที่แสดงในปฏิทินนั้น ทำได้โดยใช้ .setLocale โดยจะปรับที่ตัวออบเจ็กต์ช่องปรับวันที่ หรือจะไปปรับที่ตัวออบเจกต์ปฏิทินโดยตรงก็ได้
หากต้องการปรับแต่งอะไรต่างๆในปฏิทินที่จะปรากฏขึ้นมากับช่องปรับวันที่นั้นทำได้โดยใช้เมธอด .calendarWidget()
แล้วก็จะได้ตัวออบเจ็กต์ปฏิทินออกมา
จากนั้นก็เอาตัวปฏิทินที่ได้มานี้มาปรับแต่งอะไรต่อได้ เช่น .setLocale เพื่อปรับ locale
เพื่อเปลี่ยนให้เป็นภาษาตามที่ต้องการ หรืออาจใช้ปรับรูปแบบด้วย .setStyleSheet ก็ได้เช่นกัน
ตัวอย่าง ลองสร้างช่องแก้วันที่ซึ่งให้ภาษาของปฏิทินต่างกันออกไป
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QDateEdit,QVBoxLayout
from PyQt5.QtCore import QLocale
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 18px')
vbl = QVBoxLayout()
natang.setLayout(vbl)
# ให้สร้างช่องปรับวันที่ โดยเปลี่ยนภาษาไปเรื่อยๆ
for phasa in ['ja','th','lo','vi','zh-tw']:
chongwanthi = QDateEdit() # สร้างช่องวันที่
vbl.addWidget(chongwanthi)
chongwanthi.setCalendarPopup(True) # ตั้งให้แสดงปฏิทิน
chongwanthi.setStyleSheet('background-color: #cff;') # ปรับสีช่องปรับวันที่
patithin = chongwanthi.calendarWidget() # เอาตัวออบเจ็กต์ปฏิทินออกมา
patithin.setLocale(QLocale(phasa)) # ตั้ง locale
# chongwanthi.setLocale(QLocale(phasa)) # เขียนแบบนี้ก็เปลี่ยนภาษาได้เหมือนกัน
patithin.setStyleSheet('background-color: #fbd;') # ปรับสีปฏิทิน
natang.show()
qAp.exec_()
ก็จะได้ช่องวันที่ออกมา ๕ ช่อง ลงกดดูปฏิทินแต่ละอันดู อย่างในภาพนี้กดแสดงภาษาลาว
สรุปท้ายบท
ในบทนี้ที่ได้แสดงวิธีใช้กล่องปรับวันที่และเวลาในเบื้องต้นไปแล้ว ที่จริงแล้วมีรายละเอียดอีกมาก
ซึ่งในที่นี้ยังไม่ได้กล่าวถึง สามารถลองศึกษาและปรับแต่งเพิ่มเติมดูได้
อ่านบทถัดไป >>
บทที่ ๑๕