Python 类型错误:';类名';对象不可调用(在通过tkinter.Button.command调用的方法中)

Python 类型错误:';类名';对象不可调用(在通过tkinter.Button.command调用的方法中),python,tkinter,Python,Tkinter,我想在单击tkinter.Button时调用对象的方法 我已将代码缩减为以下代码。当我直接调用函数(newone)(如“newone('three'))时,一切看起来都很好,但是当单击按钮(调用相同的函数)时,我会得到一个错误 我在“TypeError:x是不可调用的”上查看了类似的帖子,但我没有发现与我的代码类似的东西,我也不知道这里出了什么问题。对lot.addone(name)的实际调用似乎有效,因为我只在想在addone()内实例化一个新对象时才会出现错误。类thing()是否不再可见(

我想在单击tkinter.Button时调用对象的方法

我已将代码缩减为以下代码。当我直接调用函数(newone)(如“newone('three'))时,一切看起来都很好,但是当单击按钮(调用相同的函数)时,我会得到一个错误

我在“TypeError:x是不可调用的”上查看了类似的帖子,但我没有发现与我的代码类似的东西,我也不知道这里出了什么问题。对lot.addone(name)的实际调用似乎有效,因为我只在想在addone()内实例化一个新对象时才会出现错误。类thing()是否不再可见(由于通过tkinter.button调用它?)以及如何使其再次可见?任何帮助都将不胜感激


进口tkinter
window=tkinter.Tk()
def newone(name='four'):
全球地段
lot.addone(名称)
课程内容:
定义初始化(自):
self.name='nothing'
课程列表中的内容:
定义初始化(自):
self.things=dict()
def addone(自我,姓名):
self.things[name]=thing()##错误位置
self.things[name].name=name
lot=物品清单()
lot.addone(‘一’)###某个笨蛋
地段加一(‘两’)
newone(“三个”)####这很管用
打印(批号、物品['one'].名称)
打印(lot.things['three'].name)##打印正确
行索引=0
对于lot.things.items()中的(键、对象):
标签(window,text=thing.name).grid(row=row\u索引)
行索引=行索引+1
按钮(窗口,文本='newtask',命令=newone).grid(行=行索引)##此操作失败
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

您的类名
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()

东西
不是你想象的那样。您对变量和类使用了相同的名称。使用pep8标准将有助于避免这一特定问题。