繁体   English   中英

TypeError: action() 采用 1 个位置参数,但给出了 2 个

[英]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,因此您需要以一种或另一种方式处理它

选项1

_event参数添加到action方法。

前导下划线_是让人们知道该值未被 function 使用的约定, event是 tkinter 中事件驱动函数采用的事件参数的约定名称。默认值None不是绝对必要的,但是这是很好的做法。

def action(self, _event=None):
    self.SOURCE_SHUTTER = self.listeCombo.get()
    print(self.SOURCE_SHUTTER)
选项 2

在您的方法定义中使用*_args以允许它接受任意数量的 arguments(如@3ddavies 的回答中所建议的那样),同样, _是未使用值的约定,而args是此类参数的约定。 如前所述,这里需要注意的是,现在您的action方法将接受任意数量的 arguments - 在这种特殊情况下这不太可能成为问题,但请记住!

def action(self, *_args):
    self.SOURCE_SHUTTER = self.listeCombo.get()
    print(self.SOURCE_SHUTTER)
选项 3

使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM