私の環境
iMacOS vetura 13.2
プロセッサ Intel Core i5
PyQt6 6.5.2
何に使うのか?
PyQt6でデータの”input Form”を作っているとよく出くわすのが、年月日の入力をするLineEdit.
いちいち2023-12-01とか打ち込んでいると面倒なので、20231201と打ち込んだら2023-12-01となるようにしたいと考えました。
ついでに
・defメソッドは一つで、全てのLineEditに対応する
・8桁以外は受け付けない
・QLineEdit にフォーマットされた日付をセットする
・dataframeで使えるようにしてインスタンス変数に代入する
を含めてみました。
出来上がりのイメージ
コードは以下の通りです。よろしければコピペして使ってみてください。
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, QLineEdit
from PyQt6.QtCore import Qt, QDate # 入力した日付テキストを取得し、8桁の数字であることを確認
import PyQt6.QtCore as QtCore # QDateオブジェクトから年月日のみを取得する
# -------------------------------------------------------------
import pandas as pd
# -------------------------------------------------------------
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# クラスのインスタンス変数として定義する
# (検索の開始年月日)
self.s_date = ""
# (検索の終了年月日)
self.e_date = ""
# (保存するDataの年月日)
self.tmp_date = ""
self.initUI()
# ---------------------------------------------------------
def initUI(self):
# ウインドウのタイトルを設定
self.setWindowTitle("LineEditに入力された年月日の確認")
# -----------------------------------------------------
# レイアウトを設定
layout = QVBoxLayout()
self.setLayout(layout)
# ---------------------------------------------------
#Labelの設定
self.lbl01 = QLabel('LineEditには20231130の様に\n羅列して入力')
self.setLayout(layout)
layout.addWidget(self.lbl01)
# LineEditの設定
# lnedt01
self.lnedt01 = QLineEdit(self,placeholderText="保存年月日")
self.lnedt01.textChanged.connect(self.format_date)
self.setLayout(layout)
layout.addWidget(self.lnedt01)
# ----------------------------
# LineEditの設定
# lnedt02
self.lnedt02 = QLineEdit(self,placeholderText="開始年月日")
self.lnedt02.textChanged.connect(self.format_date)
self.setLayout(layout)
layout.addWidget(self.lnedt02)
# ----------------------------
# LineEditの設定
# lnedt03
self.lnedt03 = QLineEdit(self,placeholderText="終了年月日")
self.lnedt03.textChanged.connect(self.format_date)
self.setLayout(layout)
layout.addWidget(self.lnedt03)
# ----------------------------
# 開始ボタンの設定
self.start_btn = QPushButton('Enter',self,checkable=True)
self.start_btn.clicked.connect(self.mainText)
self.setLayout(layout)
layout.addWidget(self.start_btn)
# ------------------------------------------------------
def format_date(self, text: str):# <-method名の修正可
# 入力された数字が8桁であるかチェック
if len(text) != 8 or not text.isdigit():
return
# 8桁であれば西暦年-月-日で表示
year = int(text[0:4])
month = int(text[4:6])
day = int(text[6:8])
date = QtCore.QDate(year, month, day)
formatted_date = date.toString("yyyy-MM-dd")
julian_day = date.toJulianDay()
# ----------------------------
# 送信元のLineEditを取得
sender_widget = self.sender()
# ----------------------------
# 各 QLineEdit にフォーマットされた日付をセット
if sender_widget == self.lnedt01:# <-Line Edit名の修正可
self.lnedt01.setText(formatted_date)
elif sender_widget == self.lnedt02:
self.lnedt02.setText(formatted_date)
elif sender_widget == self.lnedt03:
self.lnedt03.setText(formatted_date)
# ----------------------------
# インスタンス変数には、各 QLineEdit に対応する変数に代入
# (.date()はDFで利用するため年月日のみにする(時分秒は非表示))
if sender_widget == self.lnedt01:# <-Line Edit名の修正可
self.tmp_date = pd.to_datetime(formatted_date).date()# <-インスタンス変数名を確認
elif sender_widget == self.lnedt02:
self.s_date = pd.to_datetime(formatted_date).date()
elif sender_widget == self.lnedt03:
self.e_date = pd.to_datetime(formatted_date).date()
# ---不要であればコメントアウト----
# (確認)日付を返す
print("self.tmp_date:", self.tmp_date)
print("self.s_date:", self.s_date)
print("self.e_date:", self.e_date)
# ------------------------------------------------------
def mainText(self):
# インスタンス変数に代入されているか確認
sv_date = self.tmp_date
print(f'sv_date:{sv_date}')
s_date = self.s_date
print(f's_date:{s_date}')
e_date = self.e_date
print(f'e_date:{e_date}')
# -----------------------------------------------------------
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()