争论不会过去

时间:2014-08-29 02:46:04

标签: python class tkinter tkinter-entry

我正在使用tkinter创建一个基本的GUI应用程序,它收集用户输入以填充docx模板。 代码太多所以我只会发布我认为问题所在的位置。这是我的按钮。

self.my_button = Button(self.master, text="Create the Contract",
                            command=lambda: self.create_contract(self.name_entry.get(),
                                                                 self.address_entry.get(),
                                                                 self.city_entry.get(),
                                                                 self.postal_code_entry.get(),
                                                                 self.phone_entry.get(),
                                                                 self.email_entry.get(),
                                                                 self.arrival_entry.get(),
                                                                 self.departure_entry.get(),
                                                                 self.total_nights_entry.get(),
                                                                 self.before_tax_entry.get(),
                                                                 self.total_nights_entry.get(),
                                                                 calculations.gst(self.before_tax_entry.get()),
                                                                 calculations.tvq(self.before_tax_entry.get()),
                                                                 calculations.minitax(self.before_tax_entry.get())
                                                                 ))

    self.my_button.grid(row=10, column=0)

    self.master.mainloop()

def create_contract(self, name, address, city, postal_code, phone, email, arrival, departure, before_tax, total_nights, gst_tax, tvq_tax, mini_tax):
    contract_template.CreateContract(name, address, city, postal_code, phone, email, arrival, departure, before_tax, total_nights, gst_tax, tvq_tax, mini_tax)

计算:

def gst(before_tax):
    guest_gst = int(before_tax) * 0.05
    return guest_gst

def tvq(before_tax):
    guest_tvq = int(before_tax) * 0.09975
    return guest_tvq

def minitax(total_nights):
    guest_minitax = int(total_nights) * 2
    return guest_minitax

现在,当我运行应用程序时,GUI会显示,我有所有条目和按钮,但是当我点击按钮时:

>>> import GUIcontract
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
    return self.func(*args)
  File "GUIcontract.py", line 76, in <lambda>
    calculations.minitax(self.before_tax_entry.get())
TypeError: create_contract() takes exactly 14 arguments (15 given)
>>>

过去8小时我一直在这。我希望我的笔记本电脑更坚固,所以我可以抛弃它。  

显然存在问题
calculations.minitax(self.before_tax_entry.get())

4 个答案:

答案 0 :(得分:4)

简单的解决方案是不以这种方式使用lambda。你让事情变得太难了。由于所有这些变量都是对象的属性,因此您可以在回调中获取它们。没有理由将它们传递给函数。

self.my_button = Button(..., command=self.create_contract)
...
def create_contract(self):
    name = self.name_entry.get()
    address = self.address_entry.get()
    ...

最终结果是一样的,但代码更容易理解和管理。长参数列表容易出现这种非常常见的错误(传递错误的参数数量),因此最好尽可能避免使用长参数列表。

一个好的经验法则是,如果你必须传递多个参数,就不要使用lambda。

答案 1 :(得分:3)

您在

中传递了额外的参数
command=lambda: self.create_contract(self.name_entry.get(),
                                                                 self.address_entry.get(),
                                                                 self.city_entry.get(),
                                                                 self.postal_code_entry.get(),
                                                                 self.phone_entry.get(),
                                                                 self.email_entry.get(),
                                                                 self.arrival_entry.get(),
                                                                 self.departure_entry.get(),
                                                                 self.total_nights_entry.get(),
                                                                 self.before_tax_entry.get(),
                                                                 self.total_nights_entry.get(),
                                                                 calculations.gst(self.before_tax_entry.get()),
                                                                 calculations.tvq(self.before_tax_entry.get()),
                                                                 calculations.minitax(self.before_tax_entry.get())
                                                                 ))

您已宣布该函数有14个参数(包括self),但您传递的是15(再次,包括self)。我不知道哪一个是额外的一个,因为用15个参数读取函数是非常困难的。你应该强烈,强烈地,强烈地考虑重构它,使它不再有15个参数。查看Builder模式,或者参数Argument Pattern。

编辑:显然额外的论点是

self.total_nights_entry.get(),
self.before_tax_entry.get(),    
self.total_nights_entry.get(),
正如mgilson在评论中指出的那样。

答案 2 :(得分:0)

def create_contract(self, name, address, city, postal_code, phone, email, arrival, departure, before_tax, total_nights, gst_tax, tvq_tax, mini_tax):
  1. self,2。name,3。address,4。city,5。postal_code,6。phone,7。email,8。arrival,9。departure,10. before_tax,11。total_nights,12.gst_tax,13 .tvq_tax,14。mini_tax
  2. create_contract需要14个参数,包括自我。

    self.create_contract(
         1. self.name_entry.get(),
         2. self.address_entry.get(),
         3. self.city_entry.get(),
         4. self.postal_code_entry.get(),
         5. self.phone_entry.get(),
         6. self.email_entry.get(),
         7. self.arrival_entry.get(),
         8. self.departure_entry.get(),
         9. self.total_nights_entry.get(),
        10. self.before_tax_entry.get(),
        11. self.total_nights_entry.get(),
        12. calculations.gst(self.before_tax_entry.get()),
        13. calculations.tvq(self.before_tax_entry.get()),
        14. calculations.minitax(self.before_tax_entry.get())
    )
    

    create_contract被传递14 args不包括自我。

答案 3 :(得分:0)

按钮中的

self.total_nights_entry.get()

被叫两次