Подтвердить что ты не робот

Как передать аргумент обработчику событий в tkinter?

widget.bind('<Button-1>',callback)   # binding 

def callback(self,event)
    #do something

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

4b9b3361

Ответ 1

Вы можете использовать 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)

Ответ 2

Что насчет

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Здесь самое простое и самое простое из них решение, которое я думаю:

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

Ответ 6

Вы также можете предоставить аргументы функции обратного вызова виджета, учитывая только то, что этот виджет определен как часть определения класса, т.е. рассмотрим эту крошечную программу 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 scope
def func_callback(arg1,arg2,arg3):
    print arg1
    print arg2
    print arg3

ЗАМЕЧАНИЕ. приведенные аргументы должны выполняться с помощью self.