Python tkinter GUI プログラミング Entryその2

 今日も見に来てくださって、ありがとうございます。石川さんです。

 在宅勤務二日目、調子が出てまいりました。皆さんはいかがでしょうか。さて、先日はEntryについて軽く紹介しましたが、今日はもうちょっと突っ込んで、日付入力用のEntryをつくることを考えてみたいと思います。

 ちょっとやってみましたが、満足いくものにならなかったので、引き続き検討したいと思いますが、今回作ってみたものを紹介しておきます。「Python GUI Programing with Tkinter」という書籍を参考にして作成してみました。

出来上がりイメージ

日付入力用Entryを作りました

ソースコード

import tkinter as tk
from datetime import datetime

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        vc = (self.register(self.validate), '%V', '%d', '%i', '%S')
        ivc = (self.register(self.invalid), '%V')
        self.dentry = tk.Entry(self,
                               validate="all",
                               validatecommand=vc,
                               invalidcommand=ivc)
        self.error = tk.StringVar()
        self.error_info = tk.Label(self,textvariable=self.error)
        self.button = tk.Button(self,text="Close",command=self.destroy)

        self.dentry.pack(side=tk.TOP)
        self.error_info.pack(side=tk.TOP)
        self.button.pack(side=tk.BOTTOM)
        
    def validate(self, event, command, index, char):
        self.toggle_error()
        if event == "key":
            if command == '0': # 削除のとき
                return True
            else:
                if index in ('01235689'):
                    return char.isdigit()
                elif index in ('47'):
                    return char == '-'
                else:
                    return False
        elif event == "focusout":
            try:
                datetime.strptime(self.dentry.get(),'%Y-%m-%d')
            except:
                return False
        return True
    
    def invalid(self,event):
        if event == 'focusout':
            self.toggle_error("日付形式が正しくありません。")

    def toggle_error(self,error=""):
        self.error.set(error)
        if error:
            self.dentry.config(foreground="red")
        else:
            self.dentry.config(foreground="black")
        
if __name__ == '__main__':
    app = App()
    app.mainloop()

概要

 validateでキー入力されたとき、4番目、7番目の入力では、「-」のみ入力可能としています。それ以外のキー入力は数値のみ入力可能です。フォーカスが外れたときに、日付形式が「’%Y-%m-%d’」となっているかどうかチェックします。ここでエラーが発生したら、「日付形式が正しくありません。」と出力されるようになっています。

 何が気に入らないかというと、入力位置によって、入力できるキーを制限しているので、既に何かが入力されているタイミングでも決まった位置に数字や「-」が入力可能なので、「2020–04-099」のような入力ができてしまいます。

まとめ

 とりあえず、入力チェックが付いたものはできました。しかし、別のやり方ができないかどうか、もうちょっと検討してみます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。