回答編集履歴

2

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

2020/04/02 04:36

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  ---
78
78
 
79
- 【追記】
79
+ **【追記】**
80
80
 
81
81
  エラーを表記するバージョンも書いてみましたので一応
82
82
 
@@ -157,3 +157,61 @@
157
157
  root.mainloop()
158
158
 
159
159
  ```
160
+
161
+
162
+
163
+ ---
164
+
165
+ **【コメントを受けて再度追記】**
166
+
167
+ 入力過程で '-' のみ、'+' のみの入力値になるので、それも validation で許可する必用がありそう。
168
+
169
+ (正規表現でやろうと思ったけど面倒だったので、単純に条件文に追加しました)
170
+
171
+
172
+
173
+ Error表示版での修正は以下のようになりますね。
174
+
175
+ ```Python
176
+
177
+ # 入力した値を検証する関数(少数表記以外の入力不可)
178
+
179
+ def validate_input(val):
180
+
181
+ # 未入力状態かフォーマットに沿っていたらOK
182
+
183
+ fmt = '^[+-]?\d+(?:.\d*)?$'
184
+
185
+ if (val == '') or (val == '+') or (val == '-') or re.match(fmt, val):
186
+
187
+ return True
188
+
189
+ return False
190
+
191
+
192
+
193
+ # 入力した値が変更した場合呼ばれる関数
194
+
195
+ # こちらで範囲を検証してエラー表記
196
+
197
+ def change_entry():
198
+
199
+ if entry_val.get() == '':
200
+
201
+ err_label.config(text='値を入力してください')
202
+
203
+ elif (entry_val.get() == '+') or (entry_val.get() == '-'):
204
+
205
+ # '+'のみや'-'のみの時は入力中とみなして何もしない
206
+
207
+ pass
208
+
209
+ elif (float(entry_val.get()) < -60.) or (float(entry_val.get()) > 30.):
210
+
211
+ err_label.config(text='範囲エラー(-60.~30)')
212
+
213
+ else:
214
+
215
+ err_label.config(text='')
216
+
217
+ ```

1

サンプル追加

2020/04/02 04:36

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -71,3 +71,89 @@
71
71
  root.mainloop()
72
72
 
73
73
  ```
74
+
75
+
76
+
77
+ ---
78
+
79
+ 【追記】
80
+
81
+ エラーを表記するバージョンも書いてみましたので一応
82
+
83
+ 入力検証では数値表記かのみをチェックして、入力変更通知で範囲確認&エラー表示をおこなっております。
84
+
85
+ ```Python
86
+
87
+ from tkinter import *
88
+
89
+ from tkinter import ttk
90
+
91
+ import re
92
+
93
+
94
+
95
+ # 入力した値を検証する関数(少数表記以外の入力不可)
96
+
97
+ def validate_input(val):
98
+
99
+ # 未入力状態かフォーマットに沿っていたらOK
100
+
101
+ fmt = '^[+-]?\d+(?:.\d*)?$'
102
+
103
+ if (val == '') or re.match(fmt, val):
104
+
105
+ return True
106
+
107
+ return False
108
+
109
+
110
+
111
+ # 入力した値が変更した場合呼ばれる関数
112
+
113
+ # こちらで範囲を検証してエラー表記
114
+
115
+ def change_entry():
116
+
117
+ if entry_val.get() == '':
118
+
119
+ err_label.config(text='値を入力してください')
120
+
121
+ elif (float(entry_val.get()) < -60.) or (float(entry_val.get()) > 30.):
122
+
123
+ err_label.config(text='範囲エラー(-60.~30)')
124
+
125
+ else:
126
+
127
+ err_label.config(text='')
128
+
129
+
130
+
131
+ root = Tk()
132
+
133
+ root.title("入力制限")
134
+
135
+ root.geometry("300x100+40+40")
136
+
137
+ label1 = ttk.Label(root, text='test', padding=10)
138
+
139
+ label1.pack(fill = 'x', padx=50, pady=0)
140
+
141
+ validate = root.register(validate_input)
142
+
143
+ entry_val = StringVar()
144
+
145
+ entry_val.trace("w", lambda *arg: change_entry())
146
+
147
+ entry1 = ttk.Entry(root, width=50, validate="key", validatecommand=(validate, "%P"), textvariable=entry_val)
148
+
149
+ entry1.pack(fill = 'x', padx=50, pady=0)
150
+
151
+ err_label = Label(root, foreground='red')
152
+
153
+ err_label.pack()
154
+
155
+
156
+
157
+ root.mainloop()
158
+
159
+ ```