Python-Tkinter: Beenden der Ereignisverbreitung in Text-Widgets-Tags
Ich schreibe gerade einen Farbschema-Editor. Für die Vorschau des Schemas verwende ich ein Text-Widget, in das ich Text mit den entsprechenden Farb-Tags einfüge (die ich programmgesteuert generiere).
Was ich will, ist das folgende Verhalten:
Klicken Sie auf eine Stelle im Text-Widget, an der sich kein Text befindet: Ändern Sie die HintergrundfarbeKlicken Sie auf Text, der mit einem Tag eingefügt wurde: Ändern Sie die Tags in der entsprechenden VordergrundfarbeHier ist mein Problem:
Wenn ich auf einen getaggten Text klicke, wird der Rückruf des Tags aufgerufen. So weit, ist es gut. Dann wird aber auch der Rückruf des Text-Widgets aufgerufen, obwohl ich in der Rückrufmethode der Tags "break" zurückgebe (was die weitere Ereignisbehandlung stoppen sollte).Wie kann ich das aufhalten?
Um dieses spezielle Problem zu veranschaulichen, habe ich dieses Arbeitsbeispiel geschrieben (für Python 2 und 3):
#!/usr/bin/env python
try:
from Tkinter import *
from tkMessageBox import showinfo
except ImportError:
from tkinter import *
from tkinter.messagebox import showinfo
def on_click(event, widget_origin='?'):
showinfo('Click', '"{}"" clicked'.format(widget_origin))
return 'break'
root = Tk()
text = Text(root)
text.pack()
text.insert(CURRENT, 'Some untagged text...\n')
text.bind('<Button-1>', lambda e, w='textwidget': on_click(e, w))
for i in range(5):
tag_name = 'tag_{}'.format(i)
text.tag_config(tag_name)
text.tag_bind(tag_name, '<Button-1>',
lambda e, w=tag_name: on_click(e, w))
text.insert(CURRENT, tag_name + ' ', tag_name)
root.mainloop()
Jede Hilfe wird geschätzt!
Bearbeiten: Versuchte Python 2 auch.