TypeError: объект 'classname' не может быть вызван (внутри метода, вызываемого через tkinter.Button.command) - PullRequest
2 голосов
/ 07 июля 2019

Я хотел бы вызвать метод объекта при нажатии кнопки tkinter.Button.

Я сократил свой код до кода ниже.Когда я вызываю функцию (newone) напрямую (как в "newone ('three')"), все кажется нормальным, но когда нажимают кнопку (которая вызывает ту же функцию), я получаю сообщение об ошибке.

Я просмотрел похожие посты на тему «typerror: x ist callable», но я не нашел ничего похожего на мой код, и я понятия не имею, что здесь не так.Фактический вызов lot.addone (name), кажется, работает, так как я получаю ошибку только тогда, когда хочу создать новый объект внутри addone ().Является ли объект class () больше не видимым (из-за вызова через tkinter.button?) И как я могу сделать его снова видимым?Буду признателен за любую помощь.


    import tkinter

    window = tkinter.Tk()

    def newone(name='four'):
        global lot
        lot.addone(name)

    class thing:
        def __init__(self):
            self.name = 'nothing'

    class list_of_things:
        def __init__(self):
            self.things = dict()

        def addone(self, name):
            self.things[name] = thing()     ## the error location
            self.things[name].name = name


    lot = list_of_things()
    lot.addone('one')   ## something dummy
    lot.addone('two')
    newone('three')     ## this works

    print(lot.things['one'].name)
    print(lot.things['three'].name)   ## prints out correctly

    row_index = 0
    for (key, thing) in lot.things.items():
        tkinter.Label(window, text = thing.name).grid(row = row_index)
        row_index = row_index + 1

    tkinter.Button(window, text = 'New task', command = newone).grid(row = row_index) ## this fails

    window.mainloop()

я получаю следующую ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\tools\Miniconda3\envs\3dot6kivy\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "test.py", line 8, in newone
    lot.addone(name)
  File "test.py", line 19, in addone
    self.things[name] = thing()     ## the error location
TypeError: 'thing' object is not callable

1 Ответ

0 голосов
/ 08 июля 2019

Ваше имя класса thing было замаскировано переменной с именем thing.Я переименовал класс в Thing, и это сработало.

Другие корректировки были также сделаны в следующем коде:

import tkinter as tk


class Thing:
    def __init__(self):
        print("adding a 'Thing' object")
        self.name = 'nothing'


class ListOfThings:
    def __init__(self):
        self.things = dict()

    def addone(self, name):
        self.things[name] = Thing()
        self.things[name].name = name


def newone(name='four'):
    lot.addone(name)       # lot doesn't need to be global if you are not assigning to it


if __name__ == '__main__':

    window = tk.Tk()

    lot = ListOfThings()
    lot.addone('one')
    lot.addone('two')
    newone('three')

    print(lot.things['one'].name)
    print(lot.things['three'].name)

    row_index = 0
    for (key, thing) in lot.things.items():
        tk.Label(window, text=thing.name).grid(row=row_index)
        row_index = row_index + 1

    tk.Button(window, text='New task', command=newone).grid(row=row_index)

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