2016-11-23 92 views
0

我有一個程序根據用戶輸入填充列表。這些列表實際上是具有2個值的對象列表:名稱和數量。在使用Tkinter的GUI中顯示對象列表

我目前正在運行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() 

什麼,當我嘗試運行下面的情況是,我得到一個錯誤:「項目」對象不是可調用

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

顯示完整的錯誤消息(Traceback)。順便說一句:使用CamelCase名稱的類('類Item(object)')和lower_case名稱的變量('容器')它有助於收回代碼中的類。你使用'item'作爲類的名字,後來用'item'中的變量。它會造成問題。 – furas

+3

在添加到列表中之前,您會返回'addItem'。 'root.bind('',addItem())'正在調用函數並返回一個不綁定函數的item對象,這很可能是問題所在。 'root.bind('',addItem)'是你想要的 –

+0

我用root.bind()算出來的。謝謝! – cstmxyz

回答

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) 

是從來沒有所謂的,因爲它是一種迴歸之後,你也還沒有把輸入字段這就是你可能是指綁定,沒有根,所以實際輸入可以給出。谷歌一些Tk的例子。

相關問題