Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 18, 2012 14:55:17

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

python tkinter button-1

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
что я делаю не так?

Офлайн

#2 Дек. 18, 2012 17:58:00

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

python tkinter button-1

Тk на нажатие еще не успел изменить состояние. Надо пробовать либо release, либо tkinter.after.



Офлайн

#3 Дек. 18, 2012 19:02:41

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

python tkinter button-1

Могу предложить еще два варианта (если нужно, чтобы было обязательно “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))



Отредактировано 4kpt (Дек. 18, 2012 20:58:10)

Офлайн

#4 Дек. 18, 2012 20:27:46

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

python tkinter button-1

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

Или конечно же можно разобраться как обновляется текущий выбор и обновить состояние виджета принудительно.



Офлайн

#5 Дек. 18, 2012 20:55:50

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

python tkinter button-1

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

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

Но обновление виджета принудительно - не самый лучший вариант. В данному случае в нем нет нужды. Это сильно усложнит код. Плюс необходимо будет блокировать или обходить естественные механизмы виджета, высчитывать положение мышки и т.п.



Отредактировано 4kpt (Дек. 18, 2012 20:56:56)

Офлайн

#6 Дек. 19, 2012 07:24:00

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

python tkinter button-1

использовал ‘<ButtonRelease-1>’ вместо ‘<Button-1>’
все работает как мне и надо.
спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version