我正在使用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())
答案 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):
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()
被叫两次