我在AttributeError: float object has no attribute set
calcmpg.self.mpg.set(self.mpg)
我该如何纠正?
这是我写的程序:
此程序会提示用户输入行驶里程数和消耗的加仑数来计算MPG。
import tkinter
import tkinter.messagebox
class MilesPerGallonGUI:
def __init__(self):
#create main window
self.main_window = tkinter.Tk()
#create frames
self.frame1 = tkinter.Frame(self.main_window)
self.frame2 = tkinter.Frame(self.main_window)
self.frame3 = tkinter.Frame(self.main_window)
self.frame4 = tkinter.Frame(self.main_window)
#create label widgets
self.label1 = tkinter.Label(self.frame1, text = 'Enter miles: ')
self.label2 = tkinter.Label(self.frame2, text = 'Enter gallons: ')
#create entry widgets
self.entry1 = tkinter.Entry(self.frame1, width = 10)
self.entry2 = tkinter.Entry(self.frame2, width = 10)
#pack
self.label1.pack (side = 'left')
self.entry1.pack (side = 'left')
self.label2.pack (side = 'left')
self.entry2.pack (side = 'left')
#
self.mpg = tkinter.StringVar()
self.res = tkinter.Label(self.frame3, text = 'The MPG value is: ')
self.res_label = tkinter.Label(self.frame3, textvariable = self.mpg)
self.res.pack(side = 'left')
self.res_label.pack(side = 'left')
self.calc = tkinter.Button(self.frame4, text = 'Calculate MPG', command = self.calcmpg)
self.quit_button = tkinter.Button(self.frame4, text = 'Quit', command = self.main_window.destroy)
self.calc.pack(side = 'left')
self.quit_button.pack(side = 'left')
self.frame1.pack()
self.frame2.pack()
self.frame3.pack()
self.frame4.pack()
tkinter.mainloop()
#calcmpg for a callback function for the calculate button
def calcmpg(self):
self.test1 = float(self.entry1.get())
self.test2 = float(self.entry2.get())
self.mpg = float(self.test1/self.test2)
self.mpg.set(self.mpg)
gu = MilesPerGallonGUI()
答案 0 :(得分:3)
问题在于:
self.mpg = float(self.test1/self.test2)
self.mpg.set(self.mpg)
之前,您有self.mpg = tkinter.StringVar()
。但是,在calcmpg方法中,您将self.mpg
分配给float。 float没有set方法。
答案 1 :(得分:3)
首先将变量设置为float:
self.mpg = float(self.test1/self.test2)
self.mpg.set(self.mpg)
所以在第二行你试图使用旧的 StringVar
对象,但那已经不在了。
改为使mpg
为局部变量:
new_mpg = float(self.test1/self.test2)
self.mpg.set(new_mpg)
通过不用浮点数替换self.mpg
,而是使用新的单独的本地,您仍然可以使用StringVar
对象方法。
答案 2 :(得分:3)
替换
行self.mpg = float(self.test1/self.test2)
self.mpg.set(self.mpg)
通过
self.mpg.set(float(self.test1/self.test2))