PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。
python で日付や時間情報を扱う時にはもっぱら datetime モジュールを利用してきました。しかし GUI ライブラリに PySide6 を利用するのであれば、日付や時間情報も QDate あるいは QDateTime クラスを利用した方が便利のように思えます。
簡単なサンプルの作成を重ねて評価しようと、今回は QCalendarWidget と QDate をサンプルにしてみました。
下記の OS 環境で動作確認をしています。
![]() |
Fedora Workstation 39 | x86_64 |
Python | 3.12.1 | |
PySide6 | 6.6.1 |
サンプルを下記に示しました。
#!/usr/bin/env python | |
# coding: utf-8 | |
import sys | |
from PySide6.QtCore import QDate | |
from PySide6.QtWidgets import ( | |
QApplication, | |
QCalendarWidget, | |
QLineEdit, | |
QMainWindow, | |
QStyle, | |
QToolBar, | |
QToolButton, | |
) | |
class DateEntry(QLineEdit): | |
def __init__(self): | |
super().__init__() | |
self.qdate: QDate | None = None | |
self.setEnabled(False) | |
def getDate(self) -> QDate | None: | |
return self.qdate | |
def setDate(self, qdate: QDate): | |
self.qdate = qdate | |
self.setText('{:0=4}-{:0=2}-{:0=2}'.format( | |
qdate.year(), qdate.month(), qdate.day() | |
)) | |
class Example(QMainWindow): | |
def __init__(self): | |
super().__init__() | |
self.calendar: QCalendarWidget | None = None | |
toolbar = QToolBar() | |
self.addToolBar(toolbar) | |
self.entry = DateEntry() | |
toolbar.addWidget(self.entry) | |
but_calendar = QToolButton() | |
icon = self.style().standardIcon(QStyle.StandardPixmap.SP_DialogApplyButton) | |
but_calendar.setIcon(icon) | |
but_calendar.clicked.connect(self.on_clicked) | |
toolbar.addWidget(but_calendar) | |
def on_date_selected(self, qdate: QDate): | |
self.entry.setDate(qdate) | |
if self.calendar is not None: | |
self.calendar.hide() | |
self.calendar.deleteLater() | |
def on_clicked(self): | |
self.calendar = QCalendarWidget() | |
qdate = self.entry.getDate() | |
if qdate is not None: | |
self.calendar.setSelectedDate(qdate) | |
self.calendar.activated.connect(self.on_date_selected) | |
self.calendar.show() | |
def main(): | |
app = QApplication(sys.argv) | |
ex = Example() | |
ex.show() | |
sys.exit(app.exec()) | |
if __name__ == '__main__': | |
main() |
このサンプルを実行すると、ツールバーを持った QMainWindow クラスのインスタンスが表示されます。ツールバー上の右側にある Apply ボタンをクリックすると QCalendarWidget クラスのインスタンス(カレンダーと呼びます)が表示されます。ツールバー上の左側にある DateEntry クラスのインスタンスに日付が表示されていればその日付が、そうでなければ本日の日付が選択状態(青色)になります。
マウスでカレンダー上の日付を選択してダブルクリックすると、カレンダーが閉じられます。その際、カレンダーは選択された日付を QDate のインスタンスで返します。
返された日付は、ツールバーの左側にある DateEntry クラスのインスタンス上に表示されます。DateEntry は QLineEidt を継承したクラスで、setDate メソッドで渡された QDate の日付情報をそのままインスタンスで保持し、yyyy-mm-dd の文字列に整形して表示します。
参考サイト

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿