Python 如何在tkinter中将参数传递给事件处理程序? widget.bind(“”,回调)#绑定 def回调(自我、事件) #做点什么

Python 如何在tkinter中将参数传递给事件处理程序? widget.bind(“”,回调)#绑定 def回调(自我、事件) #做点什么,python,events,binding,arguments,tkinter,Python,Events,Binding,Arguments,Tkinter,我需要将一个参数传递给callback()。参数是一个dictionary对象。关于 widget.bind('<Button-1>',callback) # binding def callback(self,event) #do something 我认为在大多数情况下,回调不需要任何参数,因为回调可以是可以访问实例成员的实例方法: import functools def callback(self, event, param): pass arg =

我需要将一个参数传递给
callback()
。参数是一个dictionary对象。

关于

widget.bind('<Button-1>',callback)   # binding 

def callback(self,event)
    #do something

我认为在大多数情况下,回调不需要任何参数,因为回调可以是可以访问实例成员的实例方法:

import functools
def callback(self, event, param):
    pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))
从Tkinter导入*
MyObj类:
定义初始化(self,arg):
self.arg=arg
def回调(自身、事件):
打印self.arg
obj=MyObj(‘我是obj’)
root=Tk()
btn=按钮(根,text=“单击”)
btn.bind(“”,对象回调)
btn.pack()
root.mainloop()
但我认为Philipp提出的functools解决方案也非常好

您可以使用它来定义匿名函数,例如:

from Tkinter import *

class MyObj:
    def __init__(self, arg):
        self.arg = arg

    def callback(self, event):
        print self.arg

obj = MyObj('I am Obj')
root = Tk()
btn=Button(root, text="Click")
btn.bind('<Button-1>', obj.callback)
btn.pack()
root.mainloop()

将回调函数传递给实例,并从实例方法调用它

def on_mouse_down(self, event, arg):
    print(arg)
从tkinter导入*
类别MyClass:
定义初始化(self、我的回调、消息):
self.my\u callback=my\u callback
self.message=消息
def回调(自身、事件):
self.my_回调(self)
def my_回调(o):
打印(o.message)
obj=MyClass(我的_回调,“我是MyClass的实例”)
root=Tk()
btn=按钮(根,text=“单击”)
btn.bind(“”,对象回调)
btn.pack()

以下是我认为最简单、最容易阅读的解决方案:

from tkinter import *

class MyClass:

    def __init__(self, my_callback, message):
        self.my_callback = my_callback
        self.message = message

    def callback(self, event):
        self.my_callback(self)

def my_callback(o):
    print(o.message)


obj = MyClass(my_callback, "I am instance of MyClass")

root = Tk()

btn=Button(root, text="Click")
btn.bind('<Button-1>', obj.callback)
btn.pack()
widget.bind(“”,callback2)
def回调(self、event、custom_arg=None):#将“None”更改为您希望的默认值
#做点什么
def回调2(自身、事件):
回调(事件,custom_arg=something_you_set)#当按下按钮-1时,将custom_arg设置为您想要的值

您也可以为一个小部件的回调函数提供参数,只假定这个小部件被定义为<强>类定义< /强>的一部分,即考虑这个小Python 2.7程序(没有负责程序执行的部分):



请注意,提供的参数必须以
self进行。

这是新墨西哥州技术学院Tkinter 8.5参考() ‌‌‌‌‍‬‍‌‌‌‌‍‬‬‍‌‌‌‌‍‬‌‬‌‌‌‌‍‬‌‬‌‌‌‌‍‬‍‍‌‌‌‌‍‌‬‌‌‌‌‍‬‬‍‌‌‌‌‍‌‌‌‌‌‍‬‬‌‌‌‌‌‍‬‍‌‌‌‌‍‬‬‍‌‌‌‌‍‬‌‬‌‌‌‌‍‬‌‬‌‌‌‌‍‬‍‍‌‌‌‌‍‌‬‌‌‌‌‍‬‬‍‌‌‌‌‍‌‌‌‌‌‍‬‬‌

‌‌‌‌‍‬‍‌‌‌‌‍‬‬‍‌‌‌‌‍‬‌‬‌‌‌‌‍‬‌‬‌‌‌‌‍‬‍‍‌‌‌‌‍‌‬‌‌‌‌‍‬‬‍‌‌‌‌‍‌‌‌‌‌‍‬‬‌

通过这种方式,您可以根据需要添加任意多的参数:

‌‌‌‌‍‬‍‌‌‌‌‍‬‬‍‌‌‌‌‍‬‌‬‌‌‌‌‍‬‌‬‌‌‌‌‍‬‍‍‌‌‌‌‍‌‬‌‌‌‌‍‬‬‍‌‌‌‌‍‌‌‌‌‌‍‬‬‌

54.7. 额外的争论技巧 有时,您希望将事件之外的其他参数传递给处理程序

这里有一个例子。假设您的应用程序有一个由十个checkbutton组成的数组,其>小部件存储在list self.cbList中,由>范围(10)中的checkbutton编号索引

进一步假设您希望在所有十个检查按钮中为>事件编写一个名为.cbHandler的处理程序。处理程序可以通过引用传入的事件对象的.widget属性来获取触发它的实际Checkbutton>小部件,但是它如何在self.cbList中找到该Checkbutton的索引呢

最好在我们的处理程序中为checkbutton编号添加一个额外的参数,>如下所示:

但事件处理程序只传递一个参数,即事件。因此,我们不能使用上面的函数>,因为参数的数量不匹配

幸运的是,Python为函数参数提供默认值的能力为我们提供了一条出路。请查看以下代码:

def\uuu创建小部件(自):
…
self.cbList=[]创建检查按钮列表
对于范围(10)内的i:
cb=tk.检查按钮(自…)
self.cbList.append(cb)
cb.网格(行=1,列=i)
def处理程序(事件,self=self,i=i):1
返回self.\u cbHandler(事件,i)
cb.bind(“”,处理程序)
…
定义cbHandler(自身、事件、cbNumber):
…
这些行定义了一个需要三个参数的新函数处理程序。第一个>参数是传递给所有事件处理程序的事件对象,第二个和第三个>参数将设置为它们的默认值—传递它所需的额外参数

此技术可以扩展为向>处理程序提供任意数量的附加参数


您想从绑定传递它,还是在回调完成时传递它?我应该在回调完成时传递一个参数正在传递异常:leftClickCallback()获得一个意外的关键字参数“param”,您的回调是否作为param参数?从me.self.l.bind(“,functools.partial(self.leftClickCallback,param=fi))这是绑定步骤。这里出了什么问题?如何声明
leftClickCallback
方法?def leftClickCallback(self,event,param):然后如何在事件处理程序中访问该参数?政府的声明应该是什么handler@sag:查看我的编辑。简短回答:你可以像其他任何论点一样使用它。可能是因为,你用两个步骤完成了你本可以用一个步骤完成的事情。只是我的意见。
from tkinter import *

class MyClass:

    def __init__(self, my_callback, message):
        self.my_callback = my_callback
        self.message = message

    def callback(self, event):
        self.my_callback(self)

def my_callback(o):
    print(o.message)


obj = MyClass(my_callback, "I am instance of MyClass")

root = Tk()

btn=Button(root, text="Click")
btn.bind('<Button-1>', obj.callback)
btn.pack()
widget.bind('<Button-1>', callback2)

def callback(self, event, custom_arg=None): #change "None" to whatever you want the default value to be
    #do something

def callback2(self, event):
    callback(event, custom_arg=something_you_set) #set custom_arg to whatever you want it to be when Button-1 is pressed
import Tkinter as tk #To be able to get "tk.Button" safely
from Tkinter import *

class EXAMPLE(Frame):
    def __init__(self,master=None):
        Frame.__init__(self,master)

        #make the widgets appear to a grid of size = 2 X 2
        for row in range(2):
            self.grid_rowconfigure(row,minsize=20)
        for col in range(2):
            self.grid_columnconfigure(col,minsize=20)

        #Call our METHOD OF INTEREST
        self.AnyMethod()

    #This is our method of interest
    def AnyMethod(self):
        #arguments to be supplied
        self.arg1 = 'I am 1st argument'
        self.arg2 = 'I am 2nd argument'
        self.arg3 = 'I am 3rd argument'

        #Draw the widget, & supply its callback method
        self.widgetname=tk.Button(self.master,text="My Button",command=self.method_callback)
        self.widgetname.grid(row=0,column=0)

    #create a so-called 'shell method' to swallow the REAL callback function
    def method_callback(self):
        func_callback(self.arg1,self.arg2,self.arg3)

#Define the REAL callback function in the Module's scope
def func_callback(arg1,arg2,arg3):
    print arg1
    print arg2
    print arg3
def __cbHandler(self, event, cbNumber):
def __createWidgets(self):
    …
    self.cbList = []    # Create the checkbutton list
    for i in range(10):
        cb = tk.Checkbutton(self, …)
        self.cbList.append(cb)
        cb.grid( row=1, column=i)
        def handler(event, self=self, i=i):   1
            return self.__cbHandler(event, i)
        cb.bind('<Button-1>', handler)
    …
def __cbHandler(self, event, cbNumber):
    …