2010-07-21 10 views

Trả lời

8

gì về

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

cho Ngoại lệ: leftClickCallback() nhận đối số từ khóa không mong muốn 'param' – sag

+0

Gọi lại của bạn làm đối số param? Điều này hoạt động ok hình thành tôi. – luc

+0

self.l.bind ("", functools.partial (self.leftClickCallback, param = fi)) đây là bước ràng buộc.điều gì sai ở đây? – sag

4

Tôi nghĩ rằng trong hầu hết các trường hợp, bạn không cần bất kỳ lý lẽ để một callback vì gọi lại có thể là một phương pháp dụ có thể truy cập các thành viên dụ:

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

Nhưng tôi nghĩ rằng giải pháp functools do Philipp đề xuất cũng rất đẹp

34

Bạn có thể sử dụng lambda để xác định chức năng ẩn danh, chẳng hạn như:

data={"one": 1, "two": 2} 

widget.bind("<ButtonPress-1>", lambda event, arg=data: self.on_mouse_down(event, arg)) 

Lưu ý rằng arg thông qua năm trở thành chỉ là một lý lẽ thông thường mà bạn sử dụng cũng giống như tất cả các đối số khác:

def on_mouse_down(self, event, arg): 
    print(arg) 
+0

sau đó cách truy cập vào arg đó trong trình xử lý sự kiện? những gì nên được tuyên bố của người xử lý – sag

+0

@sag: xem chỉnh sửa của tôi. Câu trả lời ngắn gọn: bạn truy cập nó giống như bất kỳ đối số nào khác. –

+0

cảm ơn rất nhiều Bryan. nó là hoàn hảo. – sag

1

Vượt qua chức năng gọi lại cho các ví dụ và gọi nó là từ phương pháp dụ.

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

Đây là giải pháp đơn giản nhất và dễ nhất để đọc trong số họ tất cả tôi nghĩ:

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

Vui lòng giải thích downvotes. Đây là một diễn đàn để tìm hiểu. –

+1

Có lẽ bởi vì, bạn đã làm theo hai bước bạn có thể làm trong một bước. Chỉ là ý kiến ​​của tôi. – ihayet

0

Bạn cũng có thể cung cấp đối số cho hàm callback của một widget, chỉ cho rằng widget này được định nghĩa như một phần của một định nghĩa lớp ,, tức là xem xét chương trình này python 2.7 nhỏ (không có phần trách nhiệm thực hiện chương trình):

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 

LƯU Ý RẰNG các đối số cung cấp phải được tiến hành với self.