#python #events #button #tkinter #bind
#python #Мероприятия #кнопка #tkinter #привязка
Вопрос:
Я все еще новичок в Python и работаю над проектом, включающим графический интерфейс. Я часто использую Tkinter и buttons, и мне любопытно, есть ли способ запустить функцию с привязкой, потому что я хочу, чтобы при ее нажатии происходило что-то одно, а при ее выпуске — что-то другое.
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)
Я не понимаю, как мне это сделать, поскольку единственное, что может быть передано функции, — это событие, но моей программе требуются аргументы.
Ответ №1:
Единственный способ использовать 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.
Комментарии:
1. Спасибо, лямбды были очень интересными