Kleine Kritik am Quelltext. Bitte nicht persönlich nehmen, ist lieb gemeint.
Sind haupsächlich auch Kleinigkeiten, aber es ist ein IMHO grosser Fehler drin.
Code: Alles auswählen
menubuttons=[]
for i in range(0,len(tags)):
tag=tags[i]
menubuttons.append(Button(menuframe,text=tag))
menubuttons[-1].pack(side=LEFT,fill=Y)
Die Schleife ist "unpythonisch". Du brauchst den Index `i` eigentlich gar nicht. Man kann direkt über die `tags` iterieren. Ausserdem wird die `menubuttons` Liste später nie wieder benutzt. Das würde dann zu folgenden drei Zeilen schrumpfen:
Code: Alles auswählen
for tag in tags:
menubutton = Button(menuframe, text=tag)
menubutton.pack(side=LEFT,fill=Y)
Code: Alles auswählen
def insert_tag(ev):
tag=ev.widget["text"]
endtag=tag[0]+"/"+tag[1:]
TextBox.selection_own()
try:
f=TextBox.index(SEL_FIRST)
l=TextBox.index(SEL_LAST)
TextBox.insert(l,endtag)
TextBox.insert(f,tag)
except:
#es ist kein text markiert
TextBox.insert(TextBox.index(INSERT),tag+endtag)
Das ``TextBox.selection_own()`` hat keinen Effekt und den Umweg über ``Text.index(SEL_*)`` braucht man nicht, man kann beim ``Text.insert()` auch gleich die entsprechenden symbolischen Konstanten benutzen:
Code: Alles auswählen
def insert_tag(ev):
tag=ev.widget["text"]
endtag=tag[0]+"/"+tag[1:]
try:
TextBox.insert(SEL_FIRST,endtag)
TextBox.insert(SEL_LAST,tag)
except TclError:
#es ist kein text markiert
TextBox.insert(INSERT,tag+endtag)
Ausserdem ist es nicht so gut ein ``except`` ohne eine konkrete Ausnahme zu benutzen, weil man dann
alles abfängt, auch Fehler die man vielleicht gerne sehen möchte um sie zu beheben.
Code: Alles auswählen
TextBox.pack(expand=1,fill=BOTH)
root.bind_class("Button","<1>",insert_tag)
Und jetzt der grössere Entwurfsfehler. Du benutzt die Buttons gar nicht, sondern bindest den Mausklick einfach an
alle Widgets. Das klappt nur zufällig weil das `Text` Widget die Mausklicks nochmal selbst behandelt und keine anderen Widgets benutzt werden.
Das die Buttons nicht wirklich benutzt werden, sieht man daran, dass sie nicht "eingedrückt" werden, wenn man darauf klickt.
Man benutzt Buttons indem man ihnen bei der Initialisierung eine Funktion mitgibt, die ausgeführt wird, wenn man den Button drückt:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Tkinter as tk
def tag_inserter(tag_text, text_widget):
start_tag = '<%s>' % tag_text
end_tag = '</%s>' % tag_text
def insert_tag():
try:
text_widget.insert(tk.SEL_FIRST, start_tag)
text_widget.insert(tk.SEL_LAST, end_tag)
except tk.TclError:
text_widget.insert(tk.INSERT, start_tag + end_tag)
return insert_tag
tags = ('b', 'i', 'pre', 'p', 'html', 'script')
root = tk.Tk()
root.title("TagInsert")
menuframe = tk.Frame(root)
menuframe.pack(expand=True, fill=tk.X)
textbox = tk.Text(root, wrap=tk.WORD)
for tag in tags:
menubutton = tk.Button(menuframe,
text=tag,
command=tag_inserter(tag, textbox))
menubutton.pack(side=tk.LEFT, fill=tk.Y)
textbox.pack(expand=True, fill=tk.BOTH)
root.mainloop()