Как передать аргумент обработчику события в tkinter? - PullRequest
21 голосов
/ 21 июля 2010
widget.bind('<Button-1>',callback)   # binding 

def callback(self,event)
    #do something

Мне нужно передать аргумент callback().Аргумент является объектом словаря.

Ответы [ 6 ]

40 голосов
/ 21 июля 2010

Вы можете использовать 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)
9 голосов
/ 21 июля 2010

А как же

import functools
def callback(self, event, param):
    pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))
4 голосов
/ 21 июля 2010

Я думаю, что в большинстве случаев вам не нужен аргумент для обратного вызова, потому что обратный вызов может быть методом экземпляра, который может получить доступ к членам экземпляра:

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Филиппом тоже очень приятно

1 голос
/ 12 сентября 2016

Вот самое простое и удобное для чтения решение из всех, что я думаю:

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
1 голос
/ 05 декабря 2013

Передайте функцию обратного вызова в экземпляр и вызовите ее из метода экземпляра.

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 голосов
/ 16 августа 2017

Вы также можете предоставить аргументы для функции обратного вызова виджета, учитывая только то, что этот виджет определен как часть определения класса , т.е. рассмотрите этот крошечный питон 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...