Для одного не используйте lambda
. Это полезно для узкого круга проблем, и это не одна из них. Создайте правильную функцию, их гораздо проще написать и поддерживать.
Как только вы это сделаете, вы можете позвонить curselection
, чтобы получить текущий выбор. Вы говорите, что пробовали это, но ваш пример кода не показывает то, что вы пробовали, поэтому я могу только предположить, что вы сделали это неправильно.
Что касается довольно необычного совета по использованию nearest
... все, что он говорит, это то, что привязки, которые вы накладываете на виджет, происходят до привязок по умолчанию для того же события. Это привязки по умолчанию, которые устанавливают выбор, поэтому, когда вы привязываетесь к одиночному нажатию кнопки , ваша привязка срабатывает до того, как выбор обновляется привязками по умолчанию. Есть много способов обойти это, лучшим из которых является , а не привязка одним щелчком мыши, а привязка <<ListboxSelect>>
, которая срабатывает после изменения выбора.
Однако у вас нет этой проблемы. Поскольку вы привязываете двойной щелчок, выбор будет установлен привязкой по одному щелчку по умолчанию, и curselection
вернет правильное значение. То есть, если у вас нет собственных привязок одним щелчком, которые предотвращают срабатывание привязки по умолчанию.
Вот простой пример, который распечатывает выбор, чтобы вы могли видеть, что он правильный. Запустите его из командной строки, чтобы увидеть stdout:
import Tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
lb = tk.Listbox(self)
lb.insert("end", "one")
lb.insert("end", "two")
lb.insert("end", "three")
lb.bind("<Double-Button-1>", self.OnDouble)
lb.pack(side="top", fill="both", expand=True)
def OnDouble(self, event):
widget = event.widget
selection=widget.curselection()
value = widget.get(selection[0])
print "selection:", selection, ": '%s'" % value
if __name__ == "__main__":
app = SampleApp()
app.mainloop()