LoginSignup
0
0

PyQt6でLineEditに日付を入力する際の簡略法

Last updated at Posted at 2023-12-19

私の環境

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で使えるようにしてインスタンス変数に代入する
を含めてみました。

出来上がりのイメージ

スクリーンショット 2023-12-19 11.08.01.png

これに値をinputすると
スクリーンショット 2023-12-19 11.10.31.png
こうなります。

コードは以下の通りです。よろしければコピペして使ってみてください。

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()

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0