2017-09-04 441 views
2

我正在編寫一個簡單的程序,將英制單位轉換爲公制單位。然而,當我使用Entry.get()命令,我需要將其轉換爲整數,當我嘗試這樣做,Python 3:Tkinter:如何將Entry.get()更改爲整數

我得到這個錯誤:

Traceback (most recent call last): 
    File "C:/Users/Bill/converter.py", line 18, in <module> 
    conversion=int(e.get()) 
ValueError: invalid literal for int() with base 10: '' 

我試圖運行的一個非常基本的版本是我正在做(這是寫在下面),但仍然導致了相同的錯誤。

import tkinter 
root= tkinter.Tk() 

e=tkinter.Entry(root) 
e.pack() 

b=tkinter.Button(root, command= lambda: print(e.get())) 
b.pack() 

conversion=int(e.get()) 
conversion= conversion* 1.8 +32 
l = tkinter.Label(root, text=conversion) 

top.mainloop() 

我最近纔開始重新編碼,所以答案很可能是對任何答案很簡單的東西,我錯過了,但感謝。

+0

要調用' e.get()創建小部件後一毫秒。用戶沒有時間輸入任何數據。 –

回答

2

問題及錯誤狀態是空字符串''無法轉換爲整數。

實際上,很多字符串不能轉換爲整數。 在你的情況下,int(e.get())產生一個錯誤,因爲該項是空的,但int('')產生了一個錯誤。 因此,您需要在轉換它之前驗證輸入,以便僅在包含整數的字符串表示形式時纔對其進行處理。

def get_value(entryWidget): 
    value = entryWidget.get() 
    try: 
     return int(value) 
    except ValueError: 
     return None 

然後,而不是設置lambda: print(e.get())作爲回調到您的按鈕,通過lambda: print(get_value(e)):在get_value功能except -

你可以用一個try。 如果該值可能被解析爲一個整數,這將打印int(e.get())的結果。 如果不能,這將打印None


這裏是你的代碼的修改後的版本:

import tkinter 
root= tkinter.Tk() 

def get_value(entryWidget): 
    value = entryWidget.get() 
    try: 
     return int(value) 
    except ValueError: 
     return None 


e = tkinter.Entry(root) 
e.pack() 

b = tkinter.Button(root, command=lambda: print(e.get())) 
b.pack() 

conversion = get_value(e) 
if conversion is not None: 
    conversion *= 1.8 + 32 
l = tkinter.Label(root, text=conversion) 

top.mainloop() 

然而,這是一個有點尷尬。 由於條目的內容在主循環之前被捕獲,所以後者將始終爲空。

在處理圖形用戶界面時,您無法像往常一樣按順序思考。 你應該先問一下你的按鈕更新標籤的內容按下時,以使其顯示轉換的結果是:

import tkinter 


def get_value(entryWidget): 
    value = entryWidget.get() 
    try: 
     return int(value) 
    except ValueError: 
     return None 

def convert(value): 
    if value is None: 
     return None 
    else: 
     return 1.8*value + 32 

def set_label_text(label, entry): 
    value = convert(get_value(entry)) 
    if value is None: 
     label['text'] = "Enter an integer" 
    else: 
     label['text'] = value 


root = tkinter.Tk() 

e = tkinter.Entry(root)  
l = tkinter.Label(root, text="") 
b = tkinter.Button(root, text="Convert", command=lambda: set_label_text(l, e)) 

e.pack() 
l.pack() 
b.pack() 

root.mainloop() 
+0

當我用你的答案幫助改變我的代碼時,它仍然不起作用,並且我得到相同的錯誤消息,但是當值不是整數時它不打印任何東西。錯誤指向這一行:'conversion = int(e.get())'。我怎樣才能解決這個問題?謝謝 –

+0

你需要擺脫這個'int(e.get())'。它應該由'get_value(e)'代替。問題是直接轉換爲'int'會產生一個錯誤,不會被捕獲。包裝這個轉換,就像我在一個函數中做的一樣,可以捕捉錯誤。 –

+0

@BillR請檢查我的編輯。我給你一個正在工作的代碼。我希望這能幫助你掌握GUI的基礎知識。 –

0

試試這個代碼:

import sys 

if sys.version_info.major < 3: # for Python 2.x 
    import Tkinter as tk 
else: # for Python 3.x 
    import tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.master.title("Conversion application") 
     self.master.geometry("300x100") 
     self.x = tk.IntVar() 
     self.grid() 
     self.createWidgets() 

    def createWidgets(self): 
     self.e = tk.Entry(self, textvariable=self.x) 
     self.e.bind('<Return>', self.convert) 
     self.e.focus() 
     self.e.grid() 
     self.b = tk.Button(self, text="Convert", command=self.convert) 
     self.b.grid() 
     self.l = tk.Label(self) 
     self.l.grid() 

    def convert(self, event=None): 
     try: 
      print(self.x.get()) 
      conversion = self.x.get() 
      conversion = conversion * 1.8 + 32 
      self.l.config(text=conversion) 
     except tk.TclError: 
      self.l.config(text="Not an integer") 

app = Application() 
app.mainloop()