2013-08-12 2 views
1

Почему этот код работаетVariable в Tkinter подстановки

objects=[ 
    ('o','label', 0, 1), 
    ('g','label', 0, 2), 
    ('e','label', 0, 3), 
    ('r','label', 1, 0), 
    ('w','label', 2, 0), 
    ('x','label', 3, 0), 
] 

for thing in objects: 
    name = thing[0] 
    type = thing[1] 
    name = tk.type() 

Я пытаюсь использовать список, чтобы определить мои TkInter виджеты в попытке сохранить код аккуратно. Первый элемент - это имя, а затем тип. Я продолжаю получать эту ошибку.

module has no attribute type 

Я знаю, что я делаю неправильно Я просто не знаю, как это исправить. Как я могу использовать значения, которые хранятся в переменной, чтобы создать виджет?

Так что я хочу name = tk.type() быть истолковано как o = tk.label()

Спасибо за любую помощь.

+1

Вы понимаете, что дважды присваиваете имя? Поэтому 'name = thing [0]' не имеет эффекта после перезаписывания 'name', снова назначая' name'. – Brionius

+0

Я знаю. То, что я хочу сделать, это иметь 'name = tk.type()' фактически создать метку с именем 'o' значение, сохраненное как имя. – dan08

ответ

2

Это не работает, потому что второй столбец в вашем списке содержит строки, а не классы. Может быть, вы должны сохранить фактический класс в списке объектов:

import Tkinter as tk 
... 
objects=[ 
    ('o',tk.Label, 0, 1), 
    ('g',tk.Label, 0, 2), 
    ('e',tk.Label, 0, 3), 
    ('r',tk.Label, 1, 0), 
    ('w',tk.Label, 2, 0), 
    ('x',tk.Label, 3, 0), 
] 
0

getattr().

name = getattr(tk, type) 

Теперь name функция, так что вы можете вызвать его с помощью функции синтаксиса (name())

0

метки виджета Tkinter в пишутся с заглавной буквой "L", так что вам нужен

objects=[ 
    ('o','Label', 0, 1), 
    ('g','Label', 0, 2), 
    ('e','Label', 0, 3), 
    ('r','Label', 1, 0), 
    ('w','Label', 2, 0), 
    ('x','Label', 3, 0), 
] 
Смежные вопросы