2014-02-06 4 views
5

Я помещаю свои кнопки в массив, но когда я их называю, их там нет. Если я распечатаю массив, я получаю:Почему мои виджеты Tkinter сохраняются как None?

{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, ...} 

Я просто не знаю, что я делаю неправильно.

from tkinter import * 

def main(): 
    pass 

if __name__ == '__main__': 
    main() 

b={} 

app = Tk() 
app.grid() 

f = Frame(app, bg = "orange", width = 500, height = 500) 
f.pack(side=BOTTOM, expand = 1) 


def color(x): 
    b[x].configure(bg="red") # Error 'NoneType' object has no attribute 'configure' 
    print(b) # 0: None, 1: None, 2: None, 3: None, 4: None, 5:.... ect 


def genABC(): 
    for r in range(3): 
     for c in range(10): 
      if (c+(r*10)>25): 
       break 
      print(c+(r*10)) 
      b[c+(r*10)] = Button(f, text=chr(97+c+(r*10)), command=lambda a=c+(r*10): color(a), borderwidth=1,width=5,bg="white").grid(row=r,column=c) 

genABC() 
app.mainloop() 

ответ

9

В grid, pack и place методы каждого Tkinter виджета работают на месте и всегда возвращают None. Это означает, что вы не можете называть их в той же строке, что и для виджета. Вместо этого, они должны называться по следующей линии:

widget = ... 
widget.grid(...) 

widget = ... 
widget.pack(...) 

widget = ... 
widget.place(...) 

Таким образом, в вашем коде, это было бы:

b[c+(r*10)] = Button(f, text=chr(97+c+(r*10)), command=lambda a=c+(r*10): color(a), borderwidth=1,width=5,bg="white") 
b[c+(r*10)].grid(row=r,column=c) 
Смежные вопросы