widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
Мне нужно передать аргумент callback()
. Аргумент - объект словаря.
widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
Мне нужно передать аргумент callback()
. Аргумент - объект словаря.
Вы можете использовать lambda
для определения анонимной функции, например:
data={"one": 1, "two": 2}
widget.bind("<ButtonPress-1>", lambda event, arg=data: self.on_mouse_down(event, arg))
Обратите внимание, что переданный arg
становится обычным аргументом, который вы используете, как и все остальные аргументы:
def on_mouse_down(self, event, arg):
print(arg)
Что насчет
import functools
def callback(self, event, param):
pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))
Я думаю, что в большинстве случаев вам не нужен какой-либо аргумент для обратного вызова, потому что обратный вызов может быть методом экземпляра, который может обращаться к членам экземпляра:
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()
Но я думаю, что решение functools, предложенное Филиппом, также очень приятно
Передайте функцию обратного вызова экземпляру и вызовите его из метода экземпляра.
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
Вы также можете предоставить аргументы функции обратного вызова виджета, учитывая только то, что этот виджет определен как часть определения класса, т.е. рассмотрим эту крошечную программу python 2.7 (без частей ответственный за выполнение программы):
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 scope
def func_callback(arg1,arg2,arg3):
print arg1
print arg2
print arg3
ЗАМЕЧАНИЕ. приведенные аргументы должны выполняться с помощью self.