今日も見に来てくださって、ありがとうございます。石川さんです。
在宅勤務二日目、調子が出てまいりました。皆さんはいかがでしょうか。さて、先日はEntryについて軽く紹介しましたが、今日はもうちょっと突っ込んで、日付入力用のEntryをつくることを考えてみたいと思います。
ちょっとやってみましたが、満足いくものにならなかったので、引き続き検討したいと思いますが、今回作ってみたものを紹介しておきます。「Python GUI Programing with Tkinter」という書籍を参考にして作成してみました。
出来上がりイメージ
ソースコード
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」のような入力ができてしまいます。
まとめ
とりあえず、入力チェックが付いたものはできました。しかし、別のやり方ができないかどうか、もうちょっと検討してみます。