Форум сайта python.su
22
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
Офлайн
11
Тk на нажатие еще не успел изменить состояние. Надо пробовать либо release, либо tkinter.after.
Офлайн
63
Могу предложить еще два варианта (если нужно, чтобы было обязательно “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)
Офлайн
11
Писал с телефона.
В общем самый надёжный способ известный мне, это получат значение по координатам.
Там же тебе даже написали что можно использовать xy.
Или конечно же можно разобраться как обновляется текущий выбор и обновить состояние виджета принудительно.
Офлайн
63
Griffon
В общем самый надёжный способ известный мне, это получат значение по координатам.Там же тебе даже написали что можно использовать xy.
def focus(event = None): print lb.nearest(event.y) lb.bind('<Button-1>', focus)
Отредактировано 4kpt (Дек. 18, 2012 20:56:56)
Офлайн
22
использовал ‘<ButtonRelease-1>’ вместо ‘<Button-1>’
все работает как мне и надо.
спасибо
Офлайн