Кнопка Python связывает две функции и отправляет аргументы с привязкой

#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. Спасибо, лямбды были очень интересными