2016-08-04 31 views
0

GUIのTKinterを使ったクラス割り当てのための基本的なBMI計算プログラムを作っていて、ユーザーの入力を検証しようとすると問題が発生しました。 数値入力のみを許可し、 '計算'ボタンを無効にして、ユーザーが数字以外のものを入力したときにエラーメッセージを送信しようとしています。しかし、分時には1桁の数字(たとえば2)に対してエラーが発生しますが、複数の桁(たとえば23)は受け入れます。私はこれについて全く新しいので、なぜこれが起こっているのか、あるいはこれを書く良い方法があるのか​​説明してください。あなたの助けを事前にPython isdigit()が予期せぬ結果を返す

#calculate button 
cal = ttk.Button(main, text = 'Calculate!') 
cal.grid(row = 4, column = 2) 

#height entry box 
hb = tk.Entry(main, textvariable = height) 
hb.grid(row = 2, column = 2) 
hb.bind('<Key>', lambda event: val(hb.get())) 

#validation error message 
vrs = tk.Label(main, text = 'Please enter a number in the box') 
vrs.grid(row = 8, column = 2) 
#so that its position is saved but won't appear until validation fails 
vrs.grid_remove() 

#validation function   
def val(value): 
    if value.isdigit(): 
     print('valid') 
     vrs.grid_remove() 
     cal.state(['!disabled']) 
    else: 
     print('invalid') 
     vrs.grid() 
     cal.state(['disabled']) 

ありがとう:ここ

は、私のコードの関連部分です。

答えて

0

あなたの仮定が正しいかどうかを確認するために、これはvalvalue内部をプリントアウトすることでデバッグするために最初にすべきこと。仮定を検証することは、常にデバッグの第一歩です。

ユーザーが入力した数字が実際にウィジェットに挿入される前に関数が呼び出されていることがわかります。これは予想される動作です。

hb.bind('<Any-KeyRelease>', lambda event: val(hb.get())) 

さらに良いEntryウィジェットの組み込みの検証機能を使用するには、次のようになります。

簡単な解決策は、文字を挿入するデフォルトの動作が<KeyPress>上にあるため、<KeyRelease>であなたの結合を置くことです。例については、https://stackoverflow.com/a/4140988/7432

-1

文字列にisdigitを使用する必要があります。

val = '23' 
val.isdigit() # True 
val = '4' 
val.isdigit() # True 
val = 'abc' 
val.isdigit() # False 

あなたが入力の種類が何であるかわからない場合は、isdigit()を呼び出す前に、文字列に最初にそれをキャスト。

あなたが唯一の1桁の数字をしたい場合は、if int(val) < 10

+0

を参照してください。私の知る限り、入力は文字列です。ちょうど私が 'str(value).isdigit():'を試みたかどうかをチェックするのに、同じ結果が出ました。明確にするために、私は排他的に1桁の数字を望んでいませんが、私はそれらを「無効」として分類したくありません – lemonshark

+0

OP _is_は文字列上でisdigitを呼び出します。 –

-1

isdigitをチェックする必要があります文字列の方法です。あなたは文字列、整数、または浮動小数点を期待していますか?

このような型検査コードをいくつか追加して、値が数値型か文字列型かに関係なくプログラムが検証されるようにすることができます。

def val(value): 
    if type(value) in (int, float): 
     # this is definitely a numerical value 
    elif type(value) in (str, unicode, bytes): 
     # this is definitely a string 
+0

OPは文字列上でisdigitを呼び出しています。 –

関連する問題