Python 类型错误:';类名';对象不可调用(在通过tkinter.Button.command调用的方法中)
我想在单击tkinter.Button时调用对象的方法 我已将代码缩减为以下代码。当我直接调用函数(newone)(如“newone('three'))时,一切看起来都很好,但是当单击按钮(调用相同的函数)时,我会得到一个错误 我在“TypeError:x是不可调用的”上查看了类似的帖子,但我没有发现与我的代码类似的东西,我也不知道这里出了什么问题。对lot.addone(name)的实际调用似乎有效,因为我只在想在addone()内实例化一个新对象时才会出现错误。类thing()是否不再可见(由于通过tkinter.button调用它?)以及如何使其再次可见?任何帮助都将不胜感激Python 类型错误:';类名';对象不可调用(在通过tkinter.Button.command调用的方法中),python,tkinter,Python,Tkinter,我想在单击tkinter.Button时调用对象的方法 我已将代码缩减为以下代码。当我直接调用函数(newone)(如“newone('three'))时,一切看起来都很好,但是当单击按钮(调用相同的函数)时,我会得到一个错误 我在“TypeError:x是不可调用的”上查看了类似的帖子,但我没有发现与我的代码类似的东西,我也不知道这里出了什么问题。对lot.addone(name)的实际调用似乎有效,因为我只在想在addone()内实例化一个新对象时才会出现错误。类thing()是否不再可见(
进口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标准将有助于避免这一特定问题。