widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
Tôi cần chuyển đối số đến callback()
. Đối số là một đối tượng từ điển.Làm thế nào để vượt qua một đối số để xử lý sự kiện trong tkinter?
widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
Tôi cần chuyển đối số đến callback()
. Đối số là một đối tượng từ điển.Làm thế nào để vượt qua một đối số để xử lý sự kiện trong tkinter?
gì về
import functools
def callback(self, event, param):
pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))
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
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)
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()
Đâ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
Vui lòng giải thích downvotes. Đây là một diễn đàn để tìm hiểu. –
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
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.
Bạn muốn vượt qua nó từ ràng buộc, hoặc khi gọi lại được thực hiện? –
tôi nên vượt qua một đối số khi gọi lại được thực hiện – sag