Я еще немного новичок в python, и я работаю над проектом, включая графический интерфейс. Я много использую с Tkinter и кнопками, и мне любопытно, есть ли способ запустить функцию с привязкой, потому что я хочу, чтобы одна вещь случалась, когда она нажимает и что-то еще, когда она отпущена.
s = str(x+1) + ":" + str(y+1)
img = ImageTk.PhotoImage(Image.open('button.png'))
b = Tkinter.Button(field_hid, image=img, borderwidth=0, highlightthickness=0, background='grey')
b.bind("<ButtonPress-1>", lambda s=s, button=b: location_down(event,s,button))
b.bind("<ButtonRelease-1>", lambda s=s, button=b: location_up(event,s,button))
b.img = img
b.pack()
b.grid(row=x, column=y)
Я не понимаю, как это сделать, поскольку единственное, что может быть передано функции, - это событие, но моя программа требует аргументов.
Единственный способ использовать bind - это вызвать функцию. Когда вы используете lambda
, вы просто создаете анонимную функцию. Вы можете легко сделать:
b.bind("<ButtonPress-1>", self.SomeOtherFunction)
lambda
полезен, когда вы хотите передать дополнительные аргументы функции. В отличие от использования опции command
, с привязками вы получаете объект события с большим количеством полезной информации, поэтому вам может не понадобиться передавать какую-либо дополнительную информацию.
Например, вы можете сделать это:
def OnPress(event):
print "widget %s was pressed" % event.widget
def OnRelease(event):
print "widget %s was released" % event.widget
b = Button(...)
b.bind("<ButtonPress-1>", OnPress)
b.bind("<ButtonRelease-1>", OnRelease)
Для хорошего введения в привязку смотрите События и привязки на сайте effbot.org.