将参数传递给绑定到键的 tkinter 事件回调

Passing arguments to a tkinter event callback bound to a key

我是 Python 的新手,这是我第一次使用 tkinter。 我正在尝试创建一个事件,如果按下 Enter 键,我的函数将被称为传递参数(在这种情况下,我想传递我的条目小部件)。 这是我的代码的简化版本:

def checkPassword(event):
    # do stuff

from tkinter import *
import tkinter.messagebox as box
window = Tk()
window.title('Booking System')
frame = Frame(window)
Entry = Entry(frame)
Entry.bind("<KeyRelease-Return>", checkPassword)
Entry.pack()
frame.pack()
window.mainloop()

此处的事件运行良好,但我在尝试传递参数时遇到问题。我试过了

def checkPassword(self, event):
    # do stuff

Entry.bind("<KeyRelease-Return>", lambda event: self.checkPassword(event, Entry))

并得到错误 NameError: global name 'self' is not defined

我也试过了

def checkPassword(self,event,param):
    # do stuff

import functools
Entry.bind("<KeyRelease-Return>", functools.partial(checkPassword, param=Entry))

但出现类型错误:checkPassword() 缺少 1 个必需的位置参数:'event'

我似乎无法解决其中任何一个问题,我已经在此处查看了类似问题的解决方案,但无法让它们中的任何一个与我的代码一起工作。

您的第二次尝试很接近,但由于 checkPassword 不是 class 方法,因此您不应在其前面加上 self.

def checkPassword(event, some_value_you_want):
    # do stuff

Entry.bind("<KeyRelease-Return>", lambda event: checkPassword(event, name_of_your_entry_widget))

Kevin 的回答对于将数据与事件实例一起包含在内的一般问题是正确的,但是当额外数据是导致事件的小部件时,Kevin 的回答是多余的。事件最多 17 attributes,包括 .widget,作为事件源的小部件。 (我强烈推荐包含上述 link 的 tkinter 参考。)以下打印 return 时输入小部件的内容。

from tkinter import *

def checkPassword(event):
    print(event.widget.get())

window = Tk()
Entry = Entry(window)
Entry.bind("<KeyRelease-Return>", checkPassword)
Entry.pack()
window.mainloop()