2017-07-03 19 views
1

私はPythonの初心者です。これはLitecoin - Euro変換プログラムです。 int()とfloat()が空の文字列をint/intに変換できないため、プログラムのEntry()フィールドに何も入れずに送信した場合、コンソールは次のエラーメッセージを出力するという問題がありました。フロート):ValueError:基数10のint()のリテラルが無効です。 '

Exception in Tkinter callback 
Traceback (most recent call last): 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__ 
return self.func(*args) 
File "/Users/Samir/Library/Mobile Documents/com~apple~CloudDocs/Coding/Python/hello_world/exch.py", line 13, in exchange 
choice = int(exc.get()) # choice of EUR to LTC or other way around 
ValueError: invalid literal for int() with base 10: '' 

私はそのことで使用全体コード:

from Tkinter import * 
from json import * 
from urllib2 import * 

def exchange(): 
    data = urlopen('https://btc-e.com/api/3/ticker/ltc_eur') # EUR - LTC API 

    j_obj = load(data) #loads json data 
    exch = float(j_obj['ltc_eur']['avg']) # picks exchange rate out of api 

    choice = int(exc.get()) # choice whether EUR to LTC or other way around 
    amount = float (am.get()) # amount of the currency the user wants to convert 

    if choice == 0: 
     print round((1/exch) * amount, 2), "Litecoins" 
    elif choice == 1: 
     print round(exch * amount, 2), "Euro" 
    else: # if something other than 0 or 1 was typed in 
     print "I'm sorry but you have to enter either 0 or 1" 

    am.delete(0, END) 
    exc.delete(0, END) 


master = Tk() # creates new window in var master 
master.wm_title("LTC - EUR converter") # creates title for the window 

Label(master, text = "EUR into LTC (0) or LTC into EUR(1): ").grid(row = 0, sticky = W) # creates choice string in a table (Row 1) 
Label(master, text = "Amount: ").grid(row = 1, sticky = E) # creates text "Amount" in a table (Row 1) 

exc = Entry(master) # picks up Entryvalue 
exc.grid(row = 0, column = 1) 

am = Entry(master) # picks up Entryvalue 
am.grid(row = 1, column = 1) # places it at row 0 colum 1 in the table 

Button(master, text = "Quit", command = master.quit).grid(row = 2, column= 1, sticky = W) # creates a quit button that closes the window 
Button(master, text = "Submit", command = exchange).grid(row = 2, column = 1) # creates a submit button that executes def "exchange" 


mainloop() # starts the program 

私は、文字列への入力を比較すると、(への入力を変換する場合は、クエリを変更することで問題を解決するために管理intおよびfloat)0または1のいずれかが入力されたことを確認した後 変更されたコード:

choice = exc.get() 
amount = am.get() 

if choice == '0': 
    choice = int(choice) 
    amount = float(amount) 

    print round((1/exch) * amount, 2), "Litecoins" 
elif choice == '1': 
    choice = int(choice) 
    amount = float(amount) 

    print round(exch * amount, 2), "Euro" 
else: 
    print "I'm sorry but you have to enter either 0 or 1" 

私の質問は、より効率的なその問題の解決策はありますか?私のアプローチはうまくいくと思うので、それはそこで最高の選択肢ではありません。

答えて

0

"It is better to ask for forgiveness than permission".

あなたはtry-exceptブロック内のコードを配置することができます。

try: 
    choice = int(choice) 
    amount = float(amount) 

except ValueError: 
    print "I'm sorry but you have to enter either 0 or 1" 
    return 

if choice == 1: 
    ... 
else: 
    ... 

この方法で、あなたは一度ではなく二回choiceの値を確認してください。

編集choiceamountのために別々のtry-except括弧を維持するのが賢明だろう場合。現在のシナリオでは、有効なchoiceを入力しても無効なamountを入力すると、誤ったエラーメッセージが表示される可能性があります。

+0

これを少し一般化したいかもしれません。ゼロまたは1を選択して入力しても、その量を空白のままにすると、間違ったエラーメッセージが表示されます。 tkinterの入力を検証する簡単なgoogleがこれを行うための標準的な方法を示します。 – Mic

+0

@Micありがとう、脚注を追加しました。 –

関連する問題