2010-09-17 29 views
12

estoy trabajando en un sistema de mensajería simple, y es necesario añadir lo siguiente a un widget de texto Tkinter:añadir características avanzadas a un widget tkinter texto

  1. corrector ortográfico
  2. Opción para cambiar la fuente (sobre la selección: texto)
  3. opción de cambiar el color de la fuente (en el texto seleccionado)
  4. opción de cambiar el tamaño de fuente (en el texto seleccionado)

I unders y que el widget de texto tkinter tiene la capacidad de utilizar múltiples fuentes y colores a través del mecanismo de etiquetado, pero no entiendo cómo hacer uso de esas capacidades.

¿Cómo puedo implementar esas características usando las funciones del widget de texto? Específicamente, cómo puedo cambiar la familia de fuentes, el color y el tamaño de las palabras, y cómo podría usar eso para implementar algo así como la revisión ortográfica, donde las palabras mal escritas están subrayadas o coloreadas de manera diferente que el resto del texto.

+0

La pregunta ahora no parece pedir un recurso, sino una implementación, como todas las demás preguntas sobre SO también lo hacen. – Trilarion

+5

Estoy perplejo por el cierre debido a estar fuera del tema. Esto no está pidiendo ayudar a encontrar un recurso o herramienta per se, sino cómo implementar algo. Es cierto que es un poco amplio, pero la respuesta aceptada no incluye herramientas externas o bibliotecas, simplemente describe cómo usar las funciones existentes. Creo que esta pregunta merece ser reabierta. –

Respuesta

25

El widget de texto Tkinter es notablemente potente, pero usted mismo tiene que hacer algunas funciones avanzadas. No tiene un corrector ortográfico incorporado ni botones incorporados para doblar texto, etc., pero son bastante fáciles de implementar. Todas las capacidades están ahí en el widget, solo necesita saber cómo hacerlo.

El siguiente ejemplo muestra un botón para alternar el estado en negrita del texto resaltado: seleccione un rango de caracteres, luego haga clic en el botón para agregar y luego elimine el atributo en negrita. Debería ser bastante fácil para usted extender este ejemplo para fuentes y colores.

El corrector ortográfico es también bastante fácil. el siguiente ejemplo usa las palabras en/usr/share/dict/words (que casi con certeza no existe en Windows 7, por lo que deberá proporcionar una lista adecuada de palabras) Es bastante simplista ya que solo corrector ortográfico cuando presiona la tecla espacio, pero eso es solo para mantener el tamaño del código del ejemplo a un nivel mínimo. En el mundo real, querrás ser un poco más inteligente cuando hagas la revisión ortográfica.

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

¡GUAU! ¡Esto es lo que estaba buscando! ¡Gracias! ¡En realidad no me di cuenta de lo fácil que sería! +1 para ti! –

+0

Sigo recibiendo un error que dice ("sel.first") es un mal índice. ¿Cómo puedo solucionar esto? –

+0

Disculpa, solo fue un error tipográfico, pero por alguna razón no configuro el texto en negrita. –

4

1) Tk no tiene un corrector ortográfico integrado. Usted puede estar interesado por PyEnchant.

2) 3) 4) no es tan difícil (por favor, olvide mi sugerencia anterior de usar wxPython). Puede pasar un tag_config como tercer arg del método insert del widget de texto. Define la configuración de esta selección.

Consulte el siguiente código, que está adaptado del ejemplo de texto en desplazamiento y effbot, que es la mejor referencia sobre 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, estoy abierto a usar wxPython. ¿Tienes alguna idea de cómo se haría esto en wx? –

+0

Olvide mi sugerencia de wxPython. Encontré una solución Tk gracias a effbot. Espero que ayude. Mejor – luc

+0

Además de agregar etiquetas durante la inserción, también puede agregarlas en tiempo de ejecución con tag_add.Entonces, por ejemplo, puede obtener el rango de caracteres seleccionados por el usuario y aplicar una etiqueta o etiquetas a ese rango de texto. –

Cuestiones relacionadas