2010-07-21 10 views
18
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?

+0

chcesz przekazać go od wiązania lub gdy zwrotna jest zrobione? –

+0

powinienem przekazać argument, gdy wywołanie zwrotne zostanie wykonane – sag

Odpowiedz

8

Co

import functools 
def callback(self, event, param): 
    pass 
arg = 123 
widget.bind("", functools.partial(callback, param=arg)) 
+0

dając wyjątek: leftClickCallback() otrzymało nieoczekiwany argument słowa kluczowego "param" – sag

+0

Czy twój callback jest argumentem param? To działa dobrze. – luc

+0

self.l.bind ("", functools.partial (self.leftClickCallback, param = fi)) to jest krok bind.whats źle tutaj? – sag

4

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

34

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) 
+0

, a następnie w jaki sposób uzyskać dostęp do tego argumentu w procedurze obsługi zdarzeń? jaka powinna być deklaracja handlerki – sag

+0

@sag: zobacz moją edycję. Krótka odpowiedź: masz do niej dostęp jak każdy inny argument. –

+0

dziękuję bardzo, Bryan. to jest idealne . – sag

1

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() 
0

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 
+0

Proszę opisać downvotes. To jest forum do nauki. –

+1

Prawdopodobnie dlatego, że zrobiłeś dwa kroki, co mogłeś zrobić w jednym. Tylko moja opinia. – ihayet

0

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.

Powiązane problemy