[python] TkInter / widget Text / tag_bind: svázání s klávesami nefunguje

petrofF petr0ff na seznam.cz
Pátek Březen 31 13:31:03 CEST 2017


Zatímco objekt <Text> svázaný s klávesami/myší funguje bez problémů,
u tagů mi to pracuje správně jen u myši:
text.tag_bind('tagA', '<Double-1>', echo) ...apod.
U kláves by měl reagovat callback svázaný s tím tagem, ve kterém právě
došlo k zápisu klávesy
Není tomu tak ...o tom, který tag (a zda vůbec nějaký) bude použit,
rozhoduje pozice kurzoru myši v okamžiku klávesové události (Press/
Release)

Příklad:
[zapisuji do tagu A]

KEY=1 (myš mimo tagy):
     <nic>

KEY=2 (myš nad tagem B):
     txt.get(2.0,3.0) = [LAST TAG]

KEY=3 (myš nad tagem A):
     txt.get(1.0,2.0) = [FIRST TAG] 123
     
[Použitý kód]

from Tkinter import *
root = Tk()

def odezva(txt,tagName):
    range = txt.tag_ranges(tagName)
    content = txt.get(range[0],range[1])
    print "txt.get(%s,%s) = %s" % (range[0],range[1],content)

text = Text(font=('courier', 15, 'normal'))
text.pack(expand=YES, fill=BOTH)

text.tag_config('A', background='purple')
text.tag_config('B', background='yellow')

text.tag_bind('A', '<KeyRelease>', lambda event: odezva(text,'A'))
text.tag_bind('B', '<KeyRelease>', lambda event: odezva(text,'B'))

text.insert('1.0', '[FIRST TAG]  \n', 'A')
text.insert('2.0', '[LAST TAG]   \n', 'B')

text.insert('3.0', '---bez tagu---')

text.mark_set(INSERT, '1.0+13char')   # Cursor v tagu A
text.focus_set()

root.mainloop()


Další informace o konferenci Python