前提・実現したいこと
python,SQliteで自分用住所録を作ろうと思っています。日付入力ENTRYの表示、入力形式をyy/mm/ddに固定しようと思います。新規登録の場合は「00/00/00」、登録済みデータの編集の場合はyy/mm/dd指定形式で表示しておき、入力は半角数字のみ有効、途中の「/」(スラッシュ)位置に入力がかかったら、次の入力位置へ自動でスキップして処理しスラッシュを残す(またスラッシュは削除禁止)、入力は6桁(スラッシュ込み 8桁)まで有効。この様なことを想定してENTRYのvalidatecommandの利用で下記のコードを実行しました。まだまだ入り口で未完成です。
****問題点及びお願い
(1)実行すると1回目のみvalidatecommandが実行されますが、2回目以降はvalidatecommandが実行されません。
(2)validateに[key]のみ指定していますが[focusout]等、[all]ではなく複数の指定方法
(3)そもそもpython,tkinterの組み合わせで上記の要求を、又はもっと良い日付ENTRYウェッジは有りませんでしょうか?(但し、あくまで1個のENTRYウェッジで処理するもの。3個の数字入力領域を作ることは想定せず)
該当のソースコード
ソースコード import tkinter as tk import tkinter.ttk as ttk class MainWindow(ttk.Frame): def __init__(self, parent): super(MainWindow, self).__init__(parent) self.parent = parent self.frame1 = tk.Frame(pady=5) self.frame1.pack(fill="x") self.entry1 = tk.Entry(self.frame1,font=("",14),justify="left", width=12) # エントリー1への初期表示指定 var = tk.StringVar() var.set("00/00/00") self.entry1["text"] = var # ***** エントリー1への入力を判定(validatecommandの設定) vcm = (self.register(self.hizuke_on_change), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') self.entry1["validate"] = "key" self.entry1["validatecommand"] = vcm self.entry1.pack(side="left") # 第2のエントリーオブジェクト self.frame2 = tk.Frame(pady=5) self.frame2.pack(fill="x") self.entry2 = tk.Entry(self.frame2,font=("",14),justify="left", width=12) self.entry2.pack(side="left") # validatecommandの処理結果表示 self.frame3 = tk.Frame(pady=5) self.frame3.pack(fill="x") self.text = tk.Text(self.frame3, height=10, width=40) self.text.pack(side="bottom", fill="both", expand=True) # ***** 入力の検証関数 def hizuke_on_change(self, d, i, P, s, S, v, V, W): self.text.delete("1.0", "end") self.text.insert("end","OnValidate:\n") self.text.insert("end","d='%s'\n" % d) self.text.insert("end","i='%s'\n" % i) self.text.insert("end","P='%s'\n" % P) self.text.insert("end","s='%s'\n" % s) self.text.insert("end","S='%s'\n" % S) self.text.insert("end","v='%s'\n" % v) self.text.insert("end","V='%s'\n" % V) self.text.insert("end","W='%s'\n" % W) application = tk.Tk() application.geometry("800x500") application.title('PyPost') window = MainWindow(application) application.protocol('WM_DELETE_WINDOW', window.quit) application.mainloop()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/27 03:39