ValueError:即使输入为int,也无法将字符串从Entry转换为int

时间:2016-05-13 16:48:50

标签: python tkinter

Entry self.r输入'1,12',我试图将其转换为(1,12)的元组。方法:         tup = tuple(对于self.r.split(“,”)中的x的int(x))适用于普通的python程序,但是当与Entry的输入一起使用时,它会给出以下错误:

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()

谢谢!!!

1 个答案:

答案 0 :(得分:-1)

这是一个&#39;陷阱&#39;我之前见过的,你期待这个:

self.r = entry_range.get()

说&#34;让self.r成为条目的字符串值&#34;但它实际上是让#{1}}成为条目的当前内容&#34;就像之后使用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

Python字符串是不可变的,因此self.r.replace(" ","") 方法返回一个 new 字符串,如果你想改变它,你通常不会做任何事情:

.replace

但是如果没有 self.r = self.r.replace(" ","") 属性,则会引发错误,因此您最终可能会使用本地变量:

setter