Переменная подстановка в ткинтер

Почему этот код не работает

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()

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

3 ответа

Решение

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

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),
]

Использование getattr(),

name = getattr(tk, type)

Сейчас name это функция, так что вы можете вызвать ее, используя синтаксис функции (name())

Виджет ярлыка 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),
]
Другие вопросы по тегам