今日も見に来てくださって、ありがとうございます。石川さんです。
在宅勤務二日目、調子が出てまいりました。皆さんはいかがでしょうか。さて、先日は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」のような入力ができてしまいます。
まとめ
とりあえず、入力チェックが付いたものはできました。しかし、別のやり方ができないかどうか、もうちょっと検討してみます。

