【问题标题】:Error when clicking the button again再次单击按钮时出错
【发布时间】:2015-12-28 09:49:25
【问题描述】:

我正在尝试制作 G.U.I.应用程序将每个条目的输入乘以特定值,然后将标签的文本设置为总计。

这是我当前的代码:

import Tkinter as tk

# Classes
class Application(tk.Frame):
    def __init__(self):

        # Create G.U.I. Framework
        self.root = tk.Tk()
        tk.Frame.__init__(self)
        self.root.title("Job Estimator")
        self.root.geometry("280x200")

        # Create G.U.I. Widgets
        tk.Label(self.root, text="Labour:    "  + unichr(163) + "40.00 x Hours")  .grid(row=0, column=0, sticky=tk.W)
        tk.Label(self.root, text="Travel:     " + unichr(163) + "1.00   x Miles") .grid(row=1, column=0, sticky=tk.W)
        tk.Label(self.root, text="Plastic:    " + unichr(163) + "2.00   x Metres").grid(row=2, column=0, sticky=tk.W)
        tk.Label(self.root, text="Copper:  "    + unichr(163) + "3.00   x Metres").grid(row=3, column=0, sticky=tk.W)
        tk.Label(self.root, text="Chrome: "     + unichr(163) + "4.00  x Metres") .grid(row=4, column=0, sticky=tk.W)
        tk.Label(self.root, text="Total: "      + unichr(163))                    .grid(row=5, column=0, sticky=tk.W)

        self.totalLabel = tk.Label(self.root, text="0.00")
        self.totalLabel.grid(row=5, column=1, sticky=tk.W)

        self.LabourInput = tk.Entry(self.root)
        self.LabourInput.grid(row=0, column=1, sticky=tk.S)

        self.TravelInput = tk.Entry(self.root)
        self.TravelInput.grid(row=1, column=1, sticky=tk.S)

        self.PlasticInput = tk.Entry(self.root)
        self.PlasticInput.grid(row=2, column=1, sticky=tk.S)

        self.CopperInput = tk.Entry(self.root)        
        self.CopperInput.grid(row=3, column=1, sticky=tk.S)

        self.ChromeInput = tk.Entry(self.root)        
        self.ChromeInput.grid(row=4, column=1, sticky=tk.S)     

        CalculateButton = tk.Button(self.root, text="Calculate", command=lambda: calc.GrandTotal()).grid(row=6, column=0, sticky=tk.W)

class Calculator():
    def __init__(self):
        pass

    def Multiply(self, number, rate):

        NumFloat = float(number)
        RateFloat = float(rate)
        return NumFloat * RateFloat

    def GrandTotal(self): # Adds each entry field to produce and return a grand total. 

        # Set Variables

        self.LabourTotal  = self.Multiply(app.LabourInput.get(), 40)
        self.TravelTotal  = self.Multiply(app.TravelInput.get(), 1)
        self.PlasticTotal = self.Multiply(app.PlasticInput.get(), 2)
        self.CopperTotal  = self.Multiply(app.CopperInput.get(), 3)
        self.ChromeTotal  = self.Multiply(app.ChromeInput.get(), 4)

        self.GrandTotal   = self.LabourTotal + self.TravelTotal + self.PlasticTotal + self.CopperTotal + self.ChromeTotal

        return app.totalLabel.config(text=self.GrandTotal) # Return the total value.

calc = Calculator()
app = Application()
app.mainloop()

这很好,除非我点击计算按钮并且它可以工作,如果我再次点击它,我会收到一条错误消息:

>>> 
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Users\Stephen\Desktop\test.py", line 39, in <lambda>
    CalculateButton = tk.Button(self.root, text="Calculate", command=lambda: calc.GrandTotal()).grid(row=6, column=0, sticky=tk.W)
TypeError: 'float' object is not callable

【问题讨论】:

标签: python tkinter


【解决方案1】:

您正在将Calculator 类的self.GrandTotal 属性更改为GrandTotal 函数内的浮点数,在该行中-

self.GrandTotal   = self.LabourTotal + self.TravelTotal + self.PlasticTotal + self.CopperTotal + self.ChromeTotal

因此,在执行此行之后,方法 GrandTotal 被浮点数覆盖,因此当您再次尝试单击按钮时,它会尝试调用 calc.GrandTotal()GrandTotal 现在是浮点数,并且因此它出错了。

您应该为浮动使用不同的名称。示例 -

self.complete_total = self.LabourTotal + self.TravelTotal + self.PlasticTotal + self.CopperTotal + self.ChromeTotal

return app.totalLabel.config(text=self.complete_total) # Return the total value.

【讨论】:

  • 谢谢!效果很好。这样一个愚蠢的错误,但我是一个完全的新手:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
相关资源
最近更新 更多