Das Tkinter-Text-Widget ist bemerkenswert leistungsstark, aber Sie müssen einige erweiterte Funktionen selbst durchführen. Es verfügt nicht über integrierte Rechtschreibprüfung oder integrierte Schaltflächen zum Kopieren von Text usw., die jedoch relativ einfach zu implementieren sind. Alle Funktionen sind im Widget vorhanden, Sie müssen nur wissen, wie es geht.
Das folgende Beispiel gibt Ihnen eine Schaltfläche, um den Fettdruck des markierten Texts umzuschalten - wählen Sie einen Bereich von Zeichen aus, klicken Sie auf die Schaltfläche zum Hinzufügen und entfernen Sie dann das Fettattribut. Es sollte ziemlich einfach für Sie sein, dieses Beispiel für Schriftarten und Farben zu erweitern.
Rechtschreibprüfung ist auch ziemlich einfach. Im folgenden Beispiel werden die Wörter in/usr/share/dict/words verwendet (was unter Windows 7 mit ziemlicher Sicherheit nicht der Fall ist. Sie müssen also eine geeignete Liste von Wörtern angeben). Es ist ziemlich einfach, da es nur Rechtschreibprüfungen durchführt wenn Sie die Leertaste drücken, aber das ist nur, um die Codegröße des Beispiels auf ein minimales Niveau zu halten. In der realen Welt werden Sie ein bisschen schlauer sein wollen, wenn Sie die Rechtschreibprüfung durchführen.
import Tkinter as tk
import tkFont
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
## Toolbar
self.toolbar = tk.Frame()
self.bold = tk.Button(name="toolbar", text="bold",
borderwidth=1, command=self.OnBold,)
self.bold.pack(in_=self.toolbar, side="left")
## Main part of the GUI
# I'll use a frame to contain the widget and
# scrollbar; it looks a little nicer that way...
text_frame = tk.Frame(borderwidth=1, relief="sunken")
self.text = tk.Text(wrap="word", background="white",
borderwidth=0, highlightthickness=0)
self.vsb = tk.Scrollbar(orient="vertical", borderwidth=1,
command=self.text.yview)
self.text.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(in_=text_frame,side="right", fill="y", expand=False)
self.text.pack(in_=text_frame, side="left", fill="both", expand=True)
self.toolbar.pack(side="top", fill="x")
text_frame.pack(side="bottom", fill="both", expand=True)
# clone the text widget font and use it as a basis for some
# tags
bold_font = tkFont.Font(self.text, self.text.cget("font"))
bold_font.configure(weight="bold")
self.text.tag_configure("bold", font=bold_font)
self.text.tag_configure("misspelled", foreground="red", underline=True)
# set up a binding to do simple spell check. This merely
# checks the previous word when you type a space. For production
# use you'll need to be a bit more intelligent about when
# to do it.
self.text.bind("<space>", self.Spellcheck)
# initialize the spell checking dictionary. YMMV.
self._words=open("/usr/share/dict/words").read().split("\n")
def Spellcheck(self, event):
'''Spellcheck the word preceeding the insertion point'''
index = self.text.search(r'\s', "insert", backwards=True, regexp=True)
if index == "":
index ="1.0"
else:
index = self.text.index("%s+1c" % index)
word = self.text.get(index, "insert")
if word in self._words:
self.text.tag_remove("misspelled", index, "%s+%dc" % (index, len(word)))
else:
self.text.tag_add("misspelled", index, "%s+%dc" % (index, len(word)))
def OnBold(self):
'''Toggle the bold state of the selected text'''
# toggle the bold state based on the first character
# in the selected range. If bold, unbold it. If not
# bold, bold it.
current_tags = self.text.tag_names("sel.first")
if "bold" in current_tags:
# first char is bold, so unbold the range
self.text.tag_remove("bold", "sel.first", "sel.last")
else:
# first char is normal, so bold the whole selection
self.text.tag_add("bold", "sel.first", "sel.last")
if __name__ == "__main__":
app=App()
app.mainloop()
Die Frage scheint nun nicht nach einer Ressource zu fragen, eher eine Umsetzung wie alle anderen Fragen zu SO auch. – Trilarion
Ich bin perplex durch das Schließen aufgrund des Off-Themes. Dies bedeutet nicht, dass Sie helfen, eine Ressource oder ein Tool per se zu finden, es fragt, wie etwas implementiert werden kann. Zugegeben, es ist ein bisschen breit, aber die akzeptierte Antwort bezieht sich nicht auf externe Tools oder Bibliotheken, es beschreibt lediglich, wie die vorhandenen Funktionen zu verwenden sind. Ich denke, diese Frage verdient es, wieder geöffnet zu werden. –