[英]TypeError: action() takes 1 positional argument but 2 were given
我曾经使用这种编码方式并且工作得很好,但是几周后回到它之后,它不再适用了。 我简化了我的代码,所以很容易在这里输入。
import tkinter as tk
from tkinter import ttk
class wind(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
# id shutter
self.SOURCE_SHUTTER = "/dev/ttyUSB0"
# menu deroulant
self.listeFlux = ["/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3"]
self.listeCombo = ttk.Combobox(self, values=self.listeFlux)
self.listeCombo.current(0)
self.listeCombo.bind("<<ComboboxSelected>>", self.action)
self.listeCombo.pack(side="top")
def action(self):
self.SOURCE_SHUTTER = self.listeCombo.get()
print(self.SOURCE_SHUTTER)
if __name__ == "__main__":
win = wind()
win.geometry("800x600")
win.mainloop()
这段代码给我错误:TypeError: action() takes 1 positional argument but 2 were given. 有人知道为什么吗? 我见过有人犯过这个错误,但他们的错误是他们的代码中某个参数缺少“self”,我认为我在这里没有忘记。
非常感谢你的帮助。 瓦伦丁
我尝试查看另一个有相同问题的主题,但我的主题在这里似乎有所不同。
一个快速而肮脏的解决方法是将action
的定义更改为:
def action(self, *args):
这里的根本问题是<<ComboboxSelected>>
似乎返回一个元组,因此当事件被触发时, self
object 和元组都被传递给action
function,这导致了错误。
上面的解决方案是一个“脏修复”,因为它允许 function 取 arguments 中大于 1 的任意数量。
tkinter 中的事件绑定将固有地将event
参数传递给绑定的 function,因此您需要以一种或另一种方式处理它
将_event
参数添加到action
方法。
前导下划线_
是让人们知道该值未被 function 使用的约定, event
是 tkinter 中事件驱动函数采用的事件参数的约定名称。默认值None
不是绝对必要的,但是这是很好的做法。
def action(self, _event=None):
self.SOURCE_SHUTTER = self.listeCombo.get()
print(self.SOURCE_SHUTTER)
在您的方法定义中使用*_args
以允许它接受任意数量的 arguments(如@3ddavies 的回答中所建议的那样),同样, _
是未使用值的约定,而args
是此类参数的约定。 如前所述,这里需要注意的是,现在您的action
方法将接受任意数量的 arguments - 在这种特殊情况下这不太可能成为问题,但请记住!
def action(self, *_args):
self.SOURCE_SHUTTER = self.listeCombo.get()
print(self.SOURCE_SHUTTER)
使用 lambda 吸收事件并以匿名方式调用action
function
def __init__(self):
... # code omitted for brevity
self.listeCombo.bind("<<ComboboxSelected>>", lambda event: self.action)
...
def action(self, _event = None):
self.SOURCE_SHUTTER = self.listeCombo.get()
print(self.SOURCE_SHUTTER)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.