将参数传递给绑定到键的 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()
我是 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()