使用 "root.protocol" 将参数传递给 Tkinter 中默认退出 window 按钮分配的函数时出现问题

problem with passing parameter to the function assigned with the default exit window button in Tkinter, using "root.protocol"

我需要一些帮助,谢谢!

我正在尝试使用 lambdas 将功能分配给 window 事件。它已经可以将 "enter" 按钮分配给一个函数。

但是,由于某些原因,它不适用于 window 上的默认退出按钮。 正如您在 create_entry_window 函数中看到的,我使用了 lambda 两次,它只对 "Return".

有效

这一行出现问题:

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

尝试退出 window 时出现此错误:

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)

快速解决您的问题非常简单:

将行root.protocol("WM_DELETE_WINDOW", (lambda event: exit_entry(root)))改为

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

root.protocol 触发时不提供参数。但是您的 lambda 需要一个。删除参数 event 解决了我的问题。

请注意您的代码还有一些其他问题。

您仍在使用 Python 2. 除非有非常令人信服的理由,否则我建议您继续使用 Python 3. 我没有遇到问题 运行 您的代码with Python 3. 我需要做的就是在 print 语句中添加方括号: print "here at exit" -> print("here at exit")

其次:您使用 global 是为了让您的功能相互通信。这被认为是不好的做法。它会导致难以调试的混乱代码。我建议您仔细查看一些 tkinter 示例以及它们如何使用面向对象的方法来处理此问题。一个可能的起点可能是 Introduction_to_GUI_Programming. The Calculator class 对我来说是一个很好的起点。