我有一个程序根据用户输入填充列表。这些列表实际上是具有2个值的对象列表:名称和数量。
我目前正在运行tkinter并尝试在GUI中以可读格式返回这些列表。这就是我到目前为止所拥有的:
from tkinter import *
from tkinter import ttk
Containers =[]
Lids = []
Wicks = []
Labels = []
Misc = []
Items = [Containers, Lids, Wicks, Labels, Misc]
class item(object):
#Constructor
def __init__(self, name, amount):
self.name = name
self.amount = amount
#Accessors
def getName(self):
return self.name
def getAmount(self):
return self.amount
def addItem(*args):
s = name.get()
global new_item
new_item = item(s, 0)
return new_item
Containers.append(new_item)
name = StringVar()
amount = StringVar()
remove_item = StringVar()
add_amount = StringVar()
subtract_amount = StringVar()
...#Leaving out all the frame information
t = Text(mainframe, width=60)
for item in Containers:
t.insert(END, item)
t.grid(column = 1, columnspan = 3, row = 10, padx = 5, pady = 10)
root.bind('<Return>', addItem())
root.mainloop()
当我尝试运行以下内容时会发生错误:我收到错误:&#39; item&#39;对象不可调用
t = Text(mainframe, width=60)
for item in Containers:
t.insert(END, item)
t.grid(column = 1, columnspan = 3, row = 10, padx = 5, pady = 10)
如何在主GUI窗口中打印这些列表?
答案 0 :(得分:1)
问题在于你的绑定:
root.bind('<Return>', addItem())
当评估此行时,addItem将返回一个项目对象at- return new_item
- 当你点击返回时,python将尝试调用new_item。你写的主要是:
new_item = additem()
root.bind('<Return>', new_item)
如果您要退回该项目,则根本没有理由使用全局变量。你的意思是:
root.bind('<Return>', addItem)
所以当你点击返回时,会调用addItem函数。在这里,您可能认为需要全局变量,但可能有更好的方法,例如将整个应用程序封装在类中。 你的代码中有很多错误,所以我建议你在提出更好的问题之前先处理一下。例如:
Containers.append(new_item)
永远不会被调用,因为它是在返回之后,你还没有输入一个你可能想要绑定的输入字段,而不是root,所以可以给出实际的输入。谷歌的一些Tk例子。