2016-05-13 62 views
0

Entry self.r輸入'1,12',我試圖將其轉換爲(1,12)的元組。方法: tup = tuple(int(x)for self in self.r.split(「,」))適用於正常的python程序,但是當與來自Entry的輸入一起使用時,會給出此錯誤:ValueError:即使輸入爲int,也無法將字符串從Entry轉換爲int

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 1549, in __call__ 
    return self.func(*args) 
    File "/Users/LazyLinh/PycharmProjects/TimeGenGUI/GUI/__init__.py", line 54, in calculateTime 
tup = tuple(int(x) for x in self.r.split(",")) 
    File "/Users/LazyLinh/PycharmProjects/TimeGenGUI/GUI/__init__.py", line 54, in <genexpr> 
tup = tuple(int(x) for x in self.r.split(",")) 
ValueError: invalid literal for int() with base 10: '' 

問題可能是什麼?這是我的完整代碼:

from tkinter import * 
import math 

class TimeGenerator: 

    def __init__(self,master): 
     frame = Frame(master) 
     frame.grid() 
     label_iso = Label(root, text="Isotope A, Element") 
     label_vol = Label(root, text="Voltage") 
     label_range = Label(root, text="Charge Range") 

     entry_iso = Entry(root) 
     entry_vol = Entry(root) 
     entry_range = Entry(root) 

     label_iso.grid(row=0, sticky=E) 
     label_vol.grid(row=1, sticky=E) 
     label_range.grid(row=2, sticky=E) 

     entry_iso.grid(row=0, column=1) 
     entry_vol.grid(row=1, column=1) 
     entry_range.grid(row=2,column=1) 

     button = Button(root, text='Time Range', command=self.calculateTime) 
     button.grid(row=3, columnspan=2) 


     self.iso = entry_iso.get() 
     self.vol = entry_vol.get() 
     self.r = entry_range.get() 

    def calculateTime(self): 
     x = 5 

     self.iso.replace(" ", "") 
     list = [] 
     for e in self.iso.split(","): 
      list.append(e) 

     f = open("/Users/LazyLinh/PycharmProjects/mass.mas12.txt", "r") 
     i = 0 
     while (i < 40): 
      header = f.readline() 
      i += 1 

     for line in f: 
      line = line.strip() 
      columns = line.split() 
      if (list[0] == columns[5]): 
       if (list[1] == columns[6]): 
        self.mass = float(columns[13]) + float(columns[14]) 

     self.r.replace(" ", "") 
     tup = tuple(int(x) for x in self.r.split(",")) 

     list = [] 
     for q in range(tup[0], tup[1] + 1): 
      y = x * math.sqrt(self.mass/(2 * q * float(self.vol))) 
      list.append(y) 
     i = tup[0] 
     for time in list: 
      print(i, ':', time) 
      i = i + 1 


root = Tk() 
b = TimeGenerator(root) 
root.mainloop() 

謝謝!!!

+0

違規前行,打印出'self.r'。它是以逗號結尾還是以兩個連續的逗號開始? – L3viathan

+0

分割將返回標記類型字符串,如果該字符串不是有效整數,則可能會導致此類錯誤。所以我認爲你可能會得到一個令牌(分割後),這是一個空格(不是有效的字符串),這個錯誤。 – cafebabe1991

+1

在輸入任何內容之前,您立即獲取條目的內容(在「_ _init__」中),您希望獲取self.calculateTime中的值,即在輸入內容後。 –

回答

-1

這是一個「疑難雜症」,我以前見過,你想到哪裏這樣的:

self.r = entry_range.get() 

說「讓self.r是項的字符串值」,但它實際上是「讓self.r當前條目的內容「,因爲在您以後使用self.r時,它仍然表示初始化後(即您調用.get())後的值,該值始終爲''。 (空字符串)

解決方法是得到的條目的內容,當你需要它所以只需要你的項目,而不是get婷引用然後立即:

self.iso_entry = entry_iso 
    self.vol_entry = entry_vol 
    self.r_entry = entry_range 

那麼您什麼時候要使用該值在入門使用.get()方法:

iso = self.iso_entry.get().replace(" ", "") 
#btw, try not to shadow the name 'list' 
list = iso.split(",") #this returns a list, no extra work needed. 
... 
r = self.r_entry.get().replace(" ","") 
tup = tuple(int(x) for x in r.split(",")) 

另一種方法是改用properties使其檢索條目的當前值,每次使用self.r時間:

class TimeGenerator: 
    @property 
    def r(self): 
     return self.r_entry.get() 
    @property 
    def iso(self): 
     return self.iso_entry.get() 
    @property 
    def vol(self): 
     return self.vol_entry.get() 

然後你可以離開這個代碼,因爲它是使用self.r將動態地獲取您的內容,但不要指望這做任何明顯的:

self.r.replace(" ","") 

Python中的字符串是不可改變的,因此.replace方法返回一個字符串,你不跟做任何事情,如果你想改變它,你通常會做:

self.r = self.r.replace(" ","") 

但不必爲此引發錯誤的屬性setter,所以你最終可能會使用局部變量反正:

r = self.r.replace(" ","") 
tup = tuple(int(x) for x in r.split(",")) 
+1

它現在很有意義,非常感謝你! –