Python - Могу ли я использовать лямбда-функцию для генерации повторяющегося графического интерфейса с помощью tkinter?(Этикетки / текст / кнопка) - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть очень повторяющийся графический интерфейс для реализации - подумайте о десятках полей меток / текстов / кнопок для формы ввода данных.Размеры каждого повторяющегося раздела могут быть одинаковыми - фактически все может быть одинаковым, за исключением текста в метке и переменной, которой назначаются данные из текстового поля после завершения.

Я работал с инженером, который использовал лямбда-функции для генерации подфункций очень сложным способом, которому я почти следовал, но не совсем на 100%.Я надеялся, поскольку это похожая, в основном повторяющаяся задача, что есть какой-то способ использовать формальную функцию для повторения работы по созданию GUI для меня, вместо того, чтобы набирать каждый элемент GUI.

Возможно ли иметь повторяющиеся элементы графического интерфейса, генерируемые функцией, и если да, то это лямбда-функция?Или есть другой (или лучший) способ добиться того же самого «не повторения»?

1 Ответ

0 голосов
/ 28 сентября 2018

Возможно ли иметь повторяющиеся элементы графического интерфейса, сгенерированные функцией, и если да, то является ли это лямбда-функцией?

Да, можно создавать элементы графического интерфейса с помощью функции,и нет, это не лямбда-функция.Мало того, что это возможно, возможно, это лучшая практика для создания элементов графического интерфейса в функции, хотя вы также можете просто использовать простой цикл или обычную функцию.

При создании групп виджетов, которые каким-то образом связаны друг с другом,еще лучше создать собственный класс, который может инкапсулировать все поведение и предоставить простой интерфейс для остальной части программы.

Пример

В следующем примере мы хотим создатьсерия виджетов с меткой, записью и кнопкой отправки.Он будет реализован как класс, поскольку мы фактически создаем объект, представляющий одно поле формы.

Примечание: в следующем коде предполагается, что вы импортировали 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())
...