質問するログイン新規登録

回答編集履歴

2

コメントを受けて回答を追記

2020/04/02 04:36

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -37,7 +37,7 @@
37
37
  ```
38
38
 
39
39
  ---
40
- 【追記】
40
+ **【追記】**
41
41
  エラーを表記するバージョンも書いてみましたので一応
42
42
  入力検証では数値表記かのみをチェックして、入力変更通知で範囲確認&エラー表示をおこなっております。
43
43
  ```Python
@@ -77,4 +77,33 @@
77
77
  err_label.pack()
78
78
 
79
79
  root.mainloop()
80
+ ```
81
+
82
+ ---
83
+ **【コメントを受けて再度追記】**
84
+ 入力過程で '-' のみ、'+' のみの入力値になるので、それも validation で許可する必用がありそう。
85
+ (正規表現でやろうと思ったけど面倒だったので、単純に条件文に追加しました)
86
+
87
+ Error表示版での修正は以下のようになりますね。
88
+ ```Python
89
+ # 入力した値を検証する関数(少数表記以外の入力不可)
90
+ def validate_input(val):
91
+ # 未入力状態かフォーマットに沿っていたらOK
92
+ fmt = '^[+-]?\d+(?:.\d*)?$'
93
+ if (val == '') or (val == '+') or (val == '-') or re.match(fmt, val):
94
+ return True
95
+ return False
96
+
97
+ # 入力した値が変更した場合呼ばれる関数
98
+ # こちらで範囲を検証してエラー表記
99
+ def change_entry():
100
+ if entry_val.get() == '':
101
+ err_label.config(text='値を入力してください')
102
+ elif (entry_val.get() == '+') or (entry_val.get() == '-'):
103
+ # '+'のみや'-'のみの時は入力中とみなして何もしない
104
+ pass
105
+ elif (float(entry_val.get()) < -60.) or (float(entry_val.get()) > 30.):
106
+ err_label.config(text='範囲エラー(-60.~30)')
107
+ else:
108
+ err_label.config(text='')
80
109
  ```

1

サンプル追加

2020/04/02 04:36

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -34,4 +34,47 @@
34
34
  entry1.pack(fill = 'x', padx=50, pady=0)
35
35
 
36
36
  root.mainloop()
37
+ ```
38
+
39
+ ---
40
+ 【追記】
41
+ エラーを表記するバージョンも書いてみましたので一応
42
+ 入力検証では数値表記かのみをチェックして、入力変更通知で範囲確認&エラー表示をおこなっております。
43
+ ```Python
44
+ from tkinter import *
45
+ from tkinter import ttk
46
+ import re
47
+
48
+ # 入力した値を検証する関数(少数表記以外の入力不可)
49
+ def validate_input(val):
50
+ # 未入力状態かフォーマットに沿っていたらOK
51
+ fmt = '^[+-]?\d+(?:.\d*)?$'
52
+ if (val == '') or re.match(fmt, val):
53
+ return True
54
+ return False
55
+
56
+ # 入力した値が変更した場合呼ばれる関数
57
+ # こちらで範囲を検証してエラー表記
58
+ def change_entry():
59
+ if entry_val.get() == '':
60
+ err_label.config(text='値を入力してください')
61
+ elif (float(entry_val.get()) < -60.) or (float(entry_val.get()) > 30.):
62
+ err_label.config(text='範囲エラー(-60.~30)')
63
+ else:
64
+ err_label.config(text='')
65
+
66
+ root = Tk()
67
+ root.title("入力制限")
68
+ root.geometry("300x100+40+40")
69
+ label1 = ttk.Label(root, text='test', padding=10)
70
+ label1.pack(fill = 'x', padx=50, pady=0)
71
+ validate = root.register(validate_input)
72
+ entry_val = StringVar()
73
+ entry_val.trace("w", lambda *arg: change_entry())
74
+ entry1 = ttk.Entry(root, width=50, validate="key", validatecommand=(validate, "%P"), textvariable=entry_val)
75
+ entry1.pack(fill = 'x', padx=50, pady=0)
76
+ err_label = Label(root, foreground='red')
77
+ err_label.pack()
78
+
79
+ root.mainloop()
37
80
  ```