■ やりたいこと
作成した入力ボックス内で、+30.00 ~ -60.00 以外の数値が入力された場合はエラーを表示させたい。
記述方法ご存知の方いたらご教授いただけますでしょうか。
python3
1 2from tkinter import * 3from tkinter import ttk 4 5root = Tk() 6root.title("入力制限") 7root.geometry("300x100+40+40") 8 9 10label1 = ttk.Label(text='test', padding=10) 11label1.pack(fill = 'x', padx=50, pady=0) 12entry1 = ttk.Entry(width=50) 13entry1.pack(fill = 'x', padx=50, pady=0) 14
何卒よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
tkinterのEntryには入力された文字列の検証を行う validatecommand (vcmd) という仕組みがありますので、これを使用するのはどうでしょうか。
(validatecommandを使用する場合、エラーが起きるのではなく単に入力できなくなります)
https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/entry-validation.html
下記は正規表現にて入力のフォーマットと、数値の範囲を調べて、エラーの場合は入力できないようにしております。
Python
1from tkinter import * 2from tkinter import ttk 3import re 4 5# 入力した値をチェックする関数 6#(OKの場合はTrue,NGの場合はFalseを返す) 7def validate_input(val): 8 # 未入力状態はOK 9 if val is '': 10 return True 11 # 下記のフォーマットに沿っており、なおかつ -60.0~20.0の範囲はOK 12 fmt = '^[+-]?[0-9]{1,2}(?:.[0-9]{,2})?$' 13 if re.match(fmt, val) and (float(val) >= -60.) and (float(val) <= 20.): 14 return True 15 # それ以外はNG 16 return False 17 18root = Tk() 19root.title("入力制限") 20root.geometry("300x100+40+40") 21label1 = ttk.Label(root, text='test', padding=10) 22label1.pack(fill = 'x', padx=50, pady=0) 23validate = root.register(validate_input) 24entry1 = ttk.Entry(root, width=50, validate="key", validatecommand=(validate, "%P")) 25entry1.pack(fill = 'x', padx=50, pady=0) 26 27root.mainloop()
【追記】
エラーを表記するバージョンも書いてみましたので一応
入力検証では数値表記かのみをチェックして、入力変更通知で範囲確認&エラー表示をおこなっております。
Python
1from tkinter import * 2from tkinter import ttk 3import re 4 5# 入力した値を検証する関数(少数表記以外の入力不可) 6def validate_input(val): 7 # 未入力状態かフォーマットに沿っていたらOK 8 fmt = '^[+-]?\d+(?:.\d*)?$' 9 if (val == '') or re.match(fmt, val): 10 return True 11 return False 12 13# 入力した値が変更した場合呼ばれる関数 14# こちらで範囲を検証してエラー表記 15def change_entry(): 16 if entry_val.get() == '': 17 err_label.config(text='値を入力してください') 18 elif (float(entry_val.get()) < -60.) or (float(entry_val.get()) > 30.): 19 err_label.config(text='範囲エラー(-60.~30)') 20 else: 21 err_label.config(text='') 22 23root = Tk() 24root.title("入力制限") 25root.geometry("300x100+40+40") 26label1 = ttk.Label(root, text='test', padding=10) 27label1.pack(fill = 'x', padx=50, pady=0) 28validate = root.register(validate_input) 29entry_val = StringVar() 30entry_val.trace("w", lambda *arg: change_entry()) 31entry1 = ttk.Entry(root, width=50, validate="key", validatecommand=(validate, "%P"), textvariable=entry_val) 32entry1.pack(fill = 'x', padx=50, pady=0) 33err_label = Label(root, foreground='red') 34err_label.pack() 35 36root.mainloop()
【コメントを受けて再度追記】
入力過程で '-' のみ、'+' のみの入力値になるので、それも validation で許可する必用がありそう。
(正規表現でやろうと思ったけど面倒だったので、単純に条件文に追加しました)
Error表示版での修正は以下のようになりますね。
Python
1# 入力した値を検証する関数(少数表記以外の入力不可) 2def validate_input(val): 3 # 未入力状態かフォーマットに沿っていたらOK 4 fmt = '^[+-]?\d+(?:.\d*)?$' 5 if (val == '') or (val == '+') or (val == '-') or re.match(fmt, val): 6 return True 7 return False 8 9# 入力した値が変更した場合呼ばれる関数 10# こちらで範囲を検証してエラー表記 11def change_entry(): 12 if entry_val.get() == '': 13 err_label.config(text='値を入力してください') 14 elif (entry_val.get() == '+') or (entry_val.get() == '-'): 15 # '+'のみや'-'のみの時は入力中とみなして何もしない 16 pass 17 elif (float(entry_val.get()) < -60.) or (float(entry_val.get()) > 30.): 18 err_label.config(text='範囲エラー(-60.~30)') 19 else: 20 err_label.config(text='')
投稿2020/04/02 01:40
編集2020/04/02 04:36総合スコア15898
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/02 01:49
2020/04/02 02:47
2020/04/02 03:45
2020/04/02 04:20
2020/04/02 04:36
2020/04/02 04:38
2020/04/02 04:38
2020/04/02 04:42 編集
2020/04/02 04:46
2020/04/02 04:54