Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 3, 2011 17:02:52

m.meehalkoff
От:
Зарегистрирован: 2011-01-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

Доброго времени суток. Возникла необходимость узнать текущее положение курсора в Tkinter.Text. Почитав доки нашел следующий способ:

current_position = text.index('insert')
Но возвращаемое значение не соответствует положению курсора. Как будто с опозданием. Курсор уже на третьей строке, а возвращаемый индекс указывает на вторую. Как мне решить этот вопрос?



Офлайн

#2 Фев. 3, 2011 17:39:25

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

m.meehalkoff
Но возвращаемое значение не соответствует положению курсора. Как будто с опозданием. Курсор уже на третьей строке, а возвращаемый индекс указывает на вторую. Как мне решить этот вопрос?
А он указывает на вторую, или возвращает 2 ? =)



Отредактировано (Фев. 3, 2011 17:39:38)

Офлайн

#3 Фев. 3, 2011 17:44:01

m.meehalkoff
От:
Зарегистрирован: 2011-01-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

regall
Возвращает 2, а должен возвращать 3.



Офлайн

#4 Фев. 3, 2011 17:48:22

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

m.meehalkoff
Возвращает 2, а должен возвращать 3.
А может нумерация начинается с 0, а не с 1?



Офлайн

#5 Фев. 3, 2011 17:53:33

m.meehalkoff
От:
Зарегистрирован: 2011-01-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

regall
m.meehalkoff
Возвращает 2, а должен возвращать 3.
А может нумерация начинается с 0, а не с 1?
Нет. Начальный индекс ‘1.0’. (строка.столбец). Речь идет о строке.



Офлайн

#6 Фев. 4, 2011 11:06:28

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

скорее всего вы запутались с событиями

from Tkinter import *
root = Tk()
text0 = Text(root)
text0.pack()

def fooKeyRelease(event):
print "Key up ",text0.index('insert')

def fooKey(event):
print "Key down ",text0.index('insert')

text0.bind("<KeyRelease>", fooKeyRelease)
text0.bind("<Key>", fooKey)

root.mainloop()



Офлайн

#7 Фев. 4, 2011 11:11:58

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

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

p.s.
Win 7, python 2.6



Офлайн

#8 Фев. 4, 2011 11:35:34

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

Хорошо. Текущее положение курсора 1.0 , нажимаем на ентер, положение курсора становится 2.0, но при событии <Key> мы узнаем предыдущее положение курсора 1.0 . Возможно это и есть проблема с которой столкнулся топикпастер.



Офлайн

#9 Фев. 4, 2011 11:51:19

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

sp3
екущее положение курсора 1.0 , нажимаем на ентер, положение курсора становится 2.0, но при событии <Key> мы узнаем предыдущее положение курсора 1.0 . Возможно это и есть проблема с которой столкнулся топикпастер.
Верно. Давайте рассмотрим нажатие клавишы вниз.
События такие:
KEY DOWN ————————— KEY UP
курсор на 2 курсор переходит на 3 курсор на 3

То есть новую позицию курсора мы получим только на отжатие клавишы. Если требуется узнать номер строки при нажатии, то следующую строку легко вычислить по трем параметрам:
- количество строк (если пытаемся перейти на строку ниже последней)
- текущая строка
- клавиша (в зависимости от клавиши прибавляем или отнимаем единицу)



Офлайн

#10 Фев. 5, 2011 18:00:10

m.meehalkoff
От:
Зарегистрирован: 2011-01-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос о Tkinter.Text

sp3
скорее всего вы запутались с событиями
from Tkinter import *
root = Tk()
text0 = Text(root)
text0.pack()

def fooKeyRelease(event):
print "Key up ",text0.index('insert')

def fooKey(event):
print "Key down ",text0.index('insert')

text0.bind("<KeyRelease>", fooKeyRelease)
text0.bind("<Key>", fooKey)

root.mainloop()
Да Вы правы. Ошибка была в обработке события. Спасибо за помощь.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version