2010-09-17 7 views
12

pracuję na prosty system przesyłania wiadomości, i trzeba dodać następujące widgetu tekstowego Tkinter:Dodaj zaawansowane funkcje widget tkinter Tekst

  1. Sprawdź pisownię
  2. możliwość zmiany czcionki (na wybrane tekst)
  3. Możliwość zmiany koloru czcionki (w wybranych tekstów)
  4. możliwość zmiany rozmiaru czcionki (na wybranym tekście)

I under tand, że widget tekstowy Tkinter ma możliwość korzystania z wielu czcionek i kolorów za pomocą mechanizmu tagowania, ale nie rozumiem, jak wykorzystać te możliwości.

Jak mogę zaimplementować te funkcje, korzystając z funkcji widżetu Tekst? W szczególności, w jaki sposób mogę zmienić rodzinę czcionek, ich kolor i rozmiar oraz jak użyć tego do zaimplementowania czegoś takiego jak sprawdzanie pisowni, w którym błędnie napisane słowa są podkreślone lub zabarwione inaczej niż reszta tekstu.

+0

Obecnie pytanie nie wymaga ressource, a raczej realizacji, podobnie jak wszystkie inne pytania dotyczące SO. – Trilarion

+5

Jestem zakłopotany zamknięciem z powodu wyłączenia tematu. To nie jest prośba o pomoc w znalezieniu zasobu lub narzędzia jako takiego, ale pytanie, jak coś można zaimplementować. Wprawdzie jest nieco szeroka, ale zaakceptowana odpowiedź nie dotyczy zewnętrznych narzędzi ani bibliotek, a jedynie opisuje sposób korzystania z istniejących funkcji. Myślę, że to pytanie zasługuje na ponowne otwarcie. –

Odpowiedz

25

Widżet tekstowy Tkinter ma niezwykłą moc, ale sam musisz wykonać pewne zaawansowane funkcje. Nie ma wbudowanego sprawdzania pisowni ani wbudowanych przycisków do pogrubiania tekstu itp., Ale są one dość łatwe do wdrożenia. Wszystkie możliwości są dostępne w widgecie, po prostu musisz wiedzieć, jak to zrobić.

Poniższy przykład przedstawia przycisk do przełączania pogrubionego stanu zaznaczonego tekstu - wybierz zakres znaków, a następnie kliknij przycisk, aby dodać, a następnie usunąć pogrubiony atrybut. Powinno być całkiem łatwo rozszerzyć ten przykład o czcionki i kolory.

Sprawdzanie pisowni jest również łatwe. w poniższym przykładzie użyto słów w/usr/share/dict/words (co prawie na pewno nie istnieje w systemie Windows 7, więc musisz podać odpowiednią listę słów) Jest to dość uproszczone, ponieważ sprawdza tylko pisownię po naciśnięciu klawisza spacji, ale tylko po to, aby rozmiar kodu przykładu był minimalny. W prawdziwym świecie będziesz bardziej inteligentny, gdy będziesz sprawdzać pisownię.

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! Tego właśnie szukałem! Dzięki! Nie zdawałem sobie sprawy, jak łatwo byłoby! +1 dla Ciebie! –

+0

Ciągle pojawia się błąd, który mówi ("pierwszy.first") jest złym indeksem. Jak to naprawić? –

+0

Przepraszam, to był tylko literówka, ale z jakiegoś powodu nie ustawiam tekstu pogrubionego. –

4

1) TK nie ma zintegrowanego sprawdzania pisowni. Może Cię zainteresować PyEnchant.

2) 3) nie jest to trudne (proszę zapomnieć o mojej poprzedniej sugestii użycia wxPython). Możesz przekazać tag_config jako trzeci argument metody wstawiania widżetu tekstowego. Określa konfigurację tego wyboru.

Zobacz następujący kod, który jest dostosowany z przykładu Scrolledtext i effbot, który jest najlepszym odniesieniem do Tk.

""" 
Some text 
hello 
""" 

from Tkinter import * 
from Tkconstants import RIGHT, LEFT, Y, BOTH 
from tkFont import Font 
from ScrolledText import ScrolledText 

def example(): 
    import __main__ 
    from Tkconstants import END 

    stext = ScrolledText(bg='white', height=10) 
    stext.insert(END, __main__.__doc__) 

    f = Font(family="times", size=30, weight="bold") 
    stext.tag_config("font", font=f) 

    stext.insert(END, "Hello", "font") 
    stext.pack(fill=BOTH, side=LEFT, expand=True) 
    stext.focus_set() 
    stext.mainloop() 

if __name__ == "__main__": 
    example() 
+0

Ok, jestem otwarty na używanie wxPython. Masz pojęcie, jak to zrobić w Wx? –

+0

Zapomnij o mojej sugestii wxPython. Znalazłem rozwiązanie Tk dzięki effbot. Mam nadzieję, że to pomoże. Best – luc

+0

Oprócz dodawania tagów podczas wstawiania, możesz także dodać je podczas pracy z tag_add.Na przykład, możesz uzyskać zakres znaków wybranych przez użytkownika i zastosować znacznik lub znaczniki do tego zakresu tekstu. –