2010-07-21 121 views
18
widget.bind('<Button-1>',callback) # binding 

def callback(self,event) 
    #do something 

我需要將參數傳遞給callback()。該參數是一個字典對象。如何將參數傳遞給tkinter中的事件處理程序?

+0

被起訴你想從綁定通過它,或回調時做? – 2010-07-21 07:05:50

+0

當回調完成時,我應該傳遞一個參數 – sag 2010-07-21 07:26:09

回答

8

什麼

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

例外: leftClickCallback()得到了一個意外的關鍵字參數'param' – sag 2010-07-21 07:31:41

+0

您的回調函數是否作爲參數參數?這對我來說很好。 – luc 2010-07-21 07:41:50

+0

self.l.bind(「」,functools.partial(self.leftClickCallback,param = fi)) 這是綁定step.whats錯誤在這裏? – sag 2010-07-21 08:54:26

4

我認爲,在大多數情況下,你不需要任何參數的回調,因爲回調可以是能夠訪問實例成員實例方法:

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

但我認爲Philipp提出的functools解決方案也非常好

34

您可以使用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) 
+0

那麼如何在事件處理程序中訪問該arg?什麼應該是處理程序 – sag 2010-07-23 06:55:55

+0

@sag的聲明:請參閱我的編輯。簡短的回答:你可以像其他任何參數一樣訪問它。 – 2010-07-23 12:19:50

+0

非常感謝Bryan。這十分完美 。 – sag 2010-07-23 15:20:39

1

傳遞迴調函數的實例,在實例方法調用它。

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

這裏是他們所有的,我認爲最簡單和最容易閱讀的解決方案:這個小部件的定義,只給

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

請解釋downvotes。這是一個學習的論壇。 – 2016-11-29 21:43:54

+1

可能是因爲,你在兩個步驟中完成了你可以在一個步驟中完成的任務。只是我的觀點。 – ihayet 2017-04-10 15:21:12

0

還可以提供參數的小工具的回調函數作爲類定義的一部分 ,,即考慮這個微小的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's scope 
def func_callback(arg1,arg2,arg3): 
    print arg1 
    print arg2 
    print arg3 

注意提供的參數必須self.