回答編集履歴
2
コメントを受けて回答を追記
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
サンプル追加
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
|
```
|