tkinter TypeError: функция принимает 1 позиционный аргумент, но 2 были заданы () - PullRequest
0 голосов
/ 29 августа 2018

У меня проблема, и я не знаю, откуда она взялась. Поскольку мой код слишком длинный, я буду использовать только функцию, генерирующую эту ошибку, и строки, в которых я ее использую (конечно, я могу поделиться другими частями, если это необходимо)

class Label(object):
    #constructor
    def __init__(self, data, id,  filefullpath, AGE, counter):

        self.counter = counter 
        self.filefullpath = filefullpath
        self.data = data             
        self.object_id = id
        self.data_length = len(data)
        self.AGE = AGE
        # GUI
        self.root = Tk()
        self.root.title("CHOOSE A LABEL")
        #Create a listbox with a scrollbar
        self.listbox = Listbox(self.root)
        type = ['Indifined','a','b','c']
        for ind, val in enumerate(type):
            self.listbox.insert(ind, val)
        self.listbox.bind('<<ListboxSelect>>', self.save)
        self.listbox.pack()
        Button(self.root, text = "OK"  , command = self.root.destroy).pack(side = 'left')
        self.root.mainloop()


    def get_selected_label(self):
        """ get the label entered by the user """
        return(self.listbox.get(self.listbox.curselection())) 

    def save(self):
        """
        Save the label entered by the user
        """
        # get the label 
        label = self.get_selected_label()

        if len(label) > 0:
            for k in range(self.AGE +2): # plus 2 to include age=-1 and age = 0
                Informations = Get_Informations(self.data, self.filefullpath, self.counter - k)
                Id    = Informations.Id()
                age   = Informations.age()
                for ind, val in enumerate(Id):
                    if self.object_id == val:
                        age = age[ind]
                        if age <= self.AGE:
                            self.data[self.counter - k]["super_clusters"][ind]["label"] = label
                        else:
                            break
                    else:
                        pass
            for k in range(self.counter +1 , len(self.data)):
                Informations = Get_Informations(self.data, self.filefullpath,  k)
                Id    = Informations.Id()
                age   = Informations.age()
                if self.object_id in Id :
                    for ind, val in enumerate(Id):
                        if self.object_id == val :
                            age = age[ind]
                            if age != -1:
                                self.data[self.counter + k]["super_clusters"][ind]["label"] = label
                            else:
                                break
                        else:
                            pass
                else:
                    # the track disappeared
                    break

Это ошибка, которую возвращает Python: поскольку я не передал ни одного аргумента для сохранения при вызове, я действительно не понимаю это сообщение.

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
TypeError: save() takes 1 positional argument but 2 were given

Заранее благодарю.

1 Ответ

0 голосов
/ 29 августа 2018

С Эффбот (акцент мой):

Tkinter предоставляет мощный механизм, который позволяет вам иметь дело с событиями самостоятельно. Для каждого виджета вы можете привязать функции и методы Python к событиям.

widget.bind(event, handler)

Если в виджете происходит событие, соответствующее описанию события, данный обработчик называется с объектом, описывающим событие .

Таким образом, функция обработчик , которую вы определили в bind, вызывается с объектом события. Этот объект содержит такие вещи, как виджет, из которого было сгенерировано событие, тип события и многое другое. Посмотрите под Объект события в ссылке effbot для полного списка.

Конечно, вы можете решить ничего не делать с этим объектом, но ваша функция имеет , чтобы принять его следующим образом:

def save(self, event):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...