проблема с передачей параметра функции, назначенной с помощью кнопки окна выхода по умолчанию в Tkinter, с использованием "root .protocol" - PullRequest
1 голос
/ 11 апреля 2020

Мне нужна помощь, спасибо!

Я пытаюсь использовать лямбды для назначения функциональности событиям окна. Это уже работало для назначения кнопки «ввод» для функции.

Но по какой-то причине он не работает для кнопки выхода по умолчанию в окне. Как вы можете видеть в функции create_entry_window, я дважды использовал lambda , и она работала только для возврата.

Проблема возникает с этой строкой:

root.protocol("WM_DELETE_WINDOW", (lambda event: exit_entry(root)))

Вот код:

from tkinter import Tk, Frame, BOTTOM, Entry, Text, END

def clear_and_get_entry(root, entry):
    """

    """
    global entered_text
    entry_text = entry.get()
    entry.delete(0, END)
    entry.insert(0, "")
    entered_text = entry_text
    root.destroy()


def exit_entry(root):
    """

    """
    global entered_text
    entered_text = False
    print "here at exit"
    root.destroy()


def create_entry_window(text):
    """

    """
    root = Tk()
    root.title("One picture is worth a thousand sounds!")
    root.geometry("500x200")
    root.resizable(width=False, height=False)
    bottom_frame = Frame(root)
    bottom_frame.pack(side=BOTTOM)
    entry = Entry(root)
    entry.pack(side=BOTTOM)
    description_text = Text(root, height=50, width=100)
    description_text.insert(END, text)
    description_text.tag_configure("center", justify='center')
    description_text.tag_add("center", "1.0", "end")
    description_text.pack()
    root.protocol("WM_DELETE_WINDOW", (lambda event: exit_entry(root)))
    entry.bind("<Return>", (lambda event: clear_and_get_entry(root, entry)))
    return root 


if __name__ == '__main__':
    root = create_entry_window("Some text")
    root.mainloop()

При попытке выйти из окна я получаю эту ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Heights\PortableApps\PortablePython2.7.6.1\App\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
TypeError: <lambda>() takes exactly 1 argument (0 given)

1 Ответ

0 голосов
/ 11 апреля 2020

Быстрое решение вашей проблемы довольно просто:

Измените строку чтения root.protocol("WM_DELETE_WINDOW", (lambda event: exit_entry(root))) на

root.protocol("WM_DELETE_WINDOW", lambda: exit_entry(root))

.Протокол root. Не вызывает аргумента при срабатывании , Но ваша лямбда ожидает этого. Удаление аргумента event устраняет проблему для меня.

Обратите внимание, что в вашем коде есть и другие проблемы.

Вы по-прежнему используете Python 2. Если есть не очень убедительные аргументы Причины для этого, я предлагаю вам перейти к Python 3. У меня не было проблем с запуском вашего кода с Python 3. Все, что мне нужно было сделать, это добавить скобки в оператор print: print "here at exit" -> print("here at exit")

Во-вторых: вы используете global, чтобы ваши функции могли взаимодействовать друг с другом. Это считается плохой практикой. Это приводит к запутанному коду, который очень сложно отлаживать. Я предлагаю вам поближе взглянуть на некоторые примеры tkinter и то, как они используют объектно-ориентированный подход для решения этой проблемы. Возможная отправная точка может быть Введение_to_GUI_Programming . Класс Calculator выглядит для меня хорошей отправной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...