widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
Muszę przekazać argument do callback()
. Argumentem jest obiekt słownika.Jak przekazać argument do obsługi zdarzeń w tkinter?
widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
Muszę przekazać argument do callback()
. Argumentem jest obiekt słownika.Jak przekazać argument do obsługi zdarzeń w tkinter?
Co
import functools
def callback(self, event, param):
pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))
myślę, że w większości przypadków nie trzeba żadnego argumentu wywołania zwrotnego, ponieważ zwrotna może być metoda instancji, które mogą uzyskać dostęp do członków przykład:
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()
Ale myślę, że rozwiązanie proponowane przez functools Philipp jest również bardzo ładne
można użyć lambda
zdefiniować anonimowej funkcji, takich jak:
data={"one": 1, "two": 2}
widget.bind("<ButtonPress-1>", lambda event, arg=data: self.on_mouse_down(event, arg))
Zauważ, że arg
przeszedł w stanie po prostu normalnym argument, że używasz podobnie jak wszystkie inne argumenty:
def on_mouse_down(self, event, arg):
print(arg)
Przepuścić funkcji zwrotnej do instancji i wywołać ją od metody instancji.
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()
Oto najprostszy i najłatwiejszy do odczytania rozwiązanie z nich wszystkich myślę:
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
Proszę opisać downvotes. To jest forum do nauki. –
Prawdopodobnie dlatego, że zrobiłeś dwa kroki, co mogłeś zrobić w jednym. Tylko moja opinia. – ihayet
Można również dostarczyć argumentów do funkcji zwrotnej widgetu, podano jedynie, że ten widget jest zdefiniowana jako część definicji klasy ,, czyli rozważyć ten mały python 2.7 programu (bez części odpowiedzialnych realizacji programu):
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
UWAGA ŻE dostarczonych argumentów należy przystąpił self.
chcesz przekazać go od wiązania lub gdy zwrotna jest zrobione? –
powinienem przekazać argument, gdy wywołanie zwrotne zostanie wykonane – sag