2010-09-17 10 views
12

ich auf einem einfachen Messaging-System arbeite, und müssen Folgendes ein Tkinter Text Widget hinzufügen:erweiterte Funktionen hinzufügen zu einem tkinter Text-Widget

  1. Spell Check
  2. Option Schriftart ändern (auf ausgewählten Text)
  3. Option Schriftfarbe zu ändern (auf ausgewählten Text)
  4. Option Schriftgröße zu ändern (auf ausgewählten Text)

I unders Und dass das Widget tkinter Text über den Tagging-Mechanismus mehrere Schriftarten und Farben verwenden kann, aber ich verstehe nicht, wie Sie diese Funktionen nutzen können.

Wie kann ich diese Funktionen mithilfe der Funktionen des Text-Widgets implementieren? Insbesondere, wie kann ich die Schriftfamilie, Farbe und Größe von Wörtern ändern, und wie kann ich das verwenden, um etwas wie Rechtschreibprüfung zu implementieren, wo falsch geschriebene Wörter anders als der Rest des Texts unterstrichen oder gefärbt werden.

+0

Die Frage scheint nun nicht nach einer Ressource zu fragen, eher eine Umsetzung wie alle anderen Fragen zu SO auch. – Trilarion

+5

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. –

Antwort

25

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() 
+0

WOW! Das habe ich gesucht! Vielen Dank! Realisierte nicht wirklich wie einfach es wäre! +1 für dich! –

+0

Ich bekomme immer einen Fehler, der sagt ("sel.first") ist ein schlechter Index. Wie behebe ich das? –

+0

Sorry, das war nur ein Tippfehler, aber ich setze den Text aus irgendeinem Grund nicht fett. –

4

1) Tk hat keine integrierte Rechtschreibprüfung. Das könnte Sie interessieren: PyEnchant.

2) 3) 4) ist nicht so schwierig (bitte vergessen Sie meinen vorherigen Vorschlag, wxPython zu verwenden). Sie können tag_config als 3. Argument der Einfügemethode des Text-Widgets übergeben. Es definiert die Konfiguration dieser Auswahl.

Siehe den folgenden Code, der aus dem Scrollled Text Beispiel und effbot die beste Referenz über Tk angepasst ist.

+0

Ok, ich bin offen für die Verwendung von wxPython. Hast du eine Idee, wie das in wx gemacht würde? –

+0

Vergiss meinen wxPython-Vorschlag. Ich habe dank effbot eine Tk-Lösung gefunden. Ich hoffe, es hilft. Am besten – luc

+0

Neben dem Hinzufügen von Tags während des Einfügens können Sie sie auch zur Laufzeit mit tag_add hinzufügen.So können Sie beispielsweise den vom Benutzer ausgewählten Zeichenbereich abrufen und ein Tag oder mehrere Tags auf diesen Textbereich anwenden. –

Verwandte Themen