Форум сайта python.su
import Tkinter def focus(event): print lb.curselection() print lb.get(lb.curselection()) root = Tkinter.Tk() lb = Tkinter.Listbox( root, height = 28, width = 50, font = '24') lb.pack() for i in range(50): lb.insert(Tkinter.END, unicode(i)) lb.bind('<Button-1>', focus) root.mainloop()
o:\>python fm1.py () Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__ return self.func(*args) File "fm1.py", line 22, in focus print lb.get(lb.curselection()) File "C:\Python27\lib\lib-tk\Tkinter.py", line 2510, in get return self.tk.call(self._w, 'get', first) TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number
('4',) 4
Офлайн
Тk на нажатие еще не успел изменить состояние. Надо пробовать либо release, либо tkinter.after.
Офлайн
Могу предложить еще два варианта (если нужно, чтобы было обязательно “Press” или “Motion” а не “Release”):
1:
lb.bind_all('<Button-1>', focus)
lb.bind('<Button-1>', focus) lb.bindtags(('Listbox', lb))
lb.bind('<Button-1>', lambda x: lb.after(0, focus))
Отредактировано 4kpt (Дек. 18, 2012 20:58:10)
Офлайн
Писал с телефона.
В общем самый надёжный способ известный мне, это получат значение по координатам.
Там же тебе даже написали что можно использовать xy.
Или конечно же можно разобраться как обновляется текущий выбор и обновить состояние виджета принудительно.
Офлайн
Griffon
В общем самый надёжный способ известный мне, это получат значение по координатам.Там же тебе даже написали что можно использовать xy.
def focus(event = None): print lb.nearest(event.y) lb.bind('<Button-1>', focus)
Отредактировано 4kpt (Дек. 18, 2012 20:56:56)
Офлайн
использовал ‘<ButtonRelease-1>’ вместо ‘<Button-1>’
все работает как мне и надо.
спасибо
Офлайн