Найти - Пользователи
Полная версия: python tkinter button-1
Начало » GUI » python tkinter button-1
1
ilnur
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()
после запуска скрипта
при нажатии на listbox получаю такую ошибку

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
что я делаю не так?
Griffon
Тk на нажатие еще не успел изменить состояние. Надо пробовать либо release, либо tkinter.after.
4kpt
Могу предложить еще два варианта (если нужно, чтобы было обязательно “Press” или “Motion” а не “Release”):
1:
lb.bind_all('<Button-1>', focus)
Вариант не очень, так как иногда при наличии двух bind_all - работает только во втором (оно то и понятно). Но как вариант - можно рассматривать :)

2:
lb.bind('<Button-1>', focus)
lb.bindtags(('Listbox', lb))
Вариант явно получше.

Вариант, предложенный Griffon тоже подходит
lb.bind('<Button-1>', lambda x: lb.after(0, focus))
Griffon
Писал с телефона.
В общем самый надёжный способ известный мне, это получат значение по координатам.
Там же тебе даже написали что можно использовать xy.

Или конечно же можно разобраться как обновляется текущий выбор и обновить состояние виджета принудительно.
4kpt
Griffon
В общем самый надёжный способ известный мне, это получат значение по координатам.Там же тебе даже написали что можно использовать xy.

Согласен :)
Анализ event.y в методе nearest(event.y) повзоляет решить эти проблемы. Но, все же, это как то хлопотно - следить за позицией мышки…
Фактически получаем четвертый вариант.
4:
def focus(event = None):
    print lb.nearest(event.y)
lb.bind('<Button-1>', focus)

Но обновление виджета принудительно - не самый лучший вариант. В данному случае в нем нет нужды. Это сильно усложнит код. Плюс необходимо будет блокировать или обходить естественные механизмы виджета, высчитывать положение мышки и т.п.
ilnur
использовал ‘<ButtonRelease-1>’ вместо ‘<Button-1>’
все работает как мне и надо.
спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB