Возможно ли иметь повторяющиеся элементы графического интерфейса, сгенерированные функцией, и если да, то является ли это лямбда-функцией?
Да, можно создавать элементы графического интерфейса с помощью функции,и нет, это не лямбда-функция.Мало того, что это возможно, возможно, это лучшая практика для создания элементов графического интерфейса в функции, хотя вы также можете просто использовать простой цикл или обычную функцию.
При создании групп виджетов, которые каким-то образом связаны друг с другом,еще лучше создать собственный класс, который может инкапсулировать все поведение и предоставить простой интерфейс для остальной части программы.
Пример
В следующем примере мы хотим создатьсерия виджетов с меткой, записью и кнопкой отправки.Он будет реализован как класс, поскольку мы фактически создаем объект, представляющий одно поле формы.
Примечание: в следующем коде предполагается, что вы импортировали tkinter с помощью import tkinter as tk
.
Во-первых, давайте создадим обратный вызов, который задает значение в словаре, а также выводит его на печать для целей отладки.Обратному вызову будет присвоено имя поля и введенное пользователем значение:
data = {}
def handle_submit(name, value):
print("you submitted '%s' for %s" % (value, name))
data[name] = value
Далее код для создания 10 элементов может выглядеть следующим образом:
root = tk.Tk()
for i in range(1, 11):
field_name = "field %s" % i
row = CustomWidget(root, name=field_name, callback=handle_submit)
Наконец, нам нужно создать наш класс.Мы наследуем от tk.Frame
, чтобы использовать его как любой другой виджет tkinter.Он должен принимать параметры для своего родителя, имени поля и функции, вызываемой при нажатии пользователем, отправить:
class CustomWidget(tk.Frame):
def __init__(self, parent, name, callback):
tk.Frame.__init__(self, parent)
self.name = name
label_text = name.title() + ":"
self.callback = callback
self.label = tk.Label(self, text=label_text, anchor="e")
self.entry = tk.Entry(self)
self.button = tk.Button(self, text="Submit", command=self.submit)
self.button.pack(side="right")
self.label.pack(side="left")
self.entry.pack(side="left", fill="x", expand=True)
def submit(self):
self.callback(self.name, self.entry.get())