Значение tkinter catch из лямбда-функции - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь обдумать эту проблему.

Скажем, у меня есть такой код:

def get_input(data_A, data_B):
    all_data = [data_A.get(),dataB.get()]
    return(all_data)

def the_gui():
    root = Tk()
    data_A = Entry(root)
    data_B = Entry(root)
    button = Button(root, text='Submit', command=lambda: get_input(data_A, data_B))
    mainloop()

Моя цель - один раз получить значение data_A и data_B Я нажал кнопку отправки. Я пытался использовать глобальную переменную и все, но мне не удавалось поймать значение.

Единственное, что работает, это когда я помещаю всю функцию get_input () в функцию __1011 * (). Однако я не думаю, что это хорошая практика для реализации.

Есть предложения?

1 Ответ

1 голос
/ 07 февраля 2020

Вот простой пример того, как вы могли бы написать это, чтобы получить результаты, которые вы ищете.

  1. При использовании global все ваши окна root и связанные с ними поля в функции. Таким образом, вам придется определять global в обеих функциях, а это не то, что вы хотите делать.

  2. Обычно вы хотите записать окно root в глобальном пространстве имен, а не в функцию или запишите ее в класс, чтобы вы могли избежать всеобщего глобального.

  3. button = Button(...) может не делать то, что вы думаете. Это не возвращает значение из команды после щелчка. Кнопки Tkinter не заботятся ни о чем возвращаемом. Таким образом, вы должны записать это значение в другом месте.

  4. Я не уверен, как работает ваш код, поскольку вы не используете менеджеры геометрии и mainloop() должен быть присоединен к окну root поэтому я добавил их также.

Пример 1:

import tkinter as tk


def get_input():
    global a_and_b
    a_and_b = [data_a.get(), data_b.get()]
    # If you want to keep a running record of all values submitted
    # then you can do this instead:
    # a_and_b.append([data_a.get(), data_b.get()])

def print_a_b():
    print(a_and_b)


root = tk.Tk()
a_and_b = []

data_a = tk.Entry(root)
data_b = tk.Entry(root)
data_a.pack()
data_b.pack()

tk.Button(root, text='Submit', command=get_input).pack()
tk.Button(root, text='Print A/B List', command=print_a_b).pack()
root.mainloop()

Пример 2 с использованием OOP:

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.a_and_b = []
        self.data_a = tk.Entry(self)
        self.data_b = tk.Entry(self)
        self.data_a.pack()
        self.data_b.pack()

        tk.Button(self, text='Submit', command=self.get_input).pack()
        tk.Button(self, text='Print A/B List', command=self.print_a_b).pack()

    def get_input(self):
        self.a_and_b = [self.data_a.get(), self.data_b.get()]

    def print_a_b(self):
        print(self.a_and_b)


if __name__ == '__main__':
    App().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...