2012-03-23 20 views
5

Estoy tratando de crear un procesador de texto simple para que los principiantes aprendan Python un poco mejor.¿Cómo detener el cambio de tamaño del widget Tkinter Text en el cambio de fuente?

estoy usando el widget Tkinter Text para el programa de edición principal, el único problema es la altura y anchura están definidas por caracteres.

Esto crea un problema cuando cambio las fuentes, ya que no todas las fuentes tienen el mismo ancho.

Cada vez que se cambia la fuente, el widget de texto cambia de tamaño, aunque técnicamente tiene el mismo ancho y alto. Esto parece ridículo cuando intento escribir algo, estoy tratando de hacer que el procesador de textos sea tan bueno como como sea posible.

¿Hay alguna forma de definir el ancho y el alto en píxeles?

.grid_propagate(False) no es útil porque el tamaño técnicamente no cambia, solo el ancho del carácter.

Estoy tratando de mantenerme alejado de wxPython por ahora, ya que todo lo que he hecho hasta este momento ha sido en Tkinter.

He hecho interminables horas de búsqueda exhaustiva en Google pero no he encontrado soluciones.

Respuesta

9

Se equivoca cuando dice que no puede usar grid_propagate(False), porque puede hacerlo. grid_propagate se relaciona con el tamaño real, no el tamaño atributo. Además, si simplemente le da a su aplicación un tamaño fijo usando wm_geometry, los cambios de fuente no afectarán el tamaño de la ventana.

Aquí hay un ejemplo usando grid_propagate, que establece el recipiente a un tamaño fijo en píxeles:

import Tkinter as tk 
import tkFont 

class SampleApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self._textFont = tkFont.Font(name="TextFont") 
     self._textFont.configure(**tkFont.nametofont("TkDefaultFont").configure()) 

     toolbar = tk.Frame(self, borderwidth=0) 
     container = tk.Frame(self, borderwidth=1, relief="sunken", 
          width=600, height=600) 
     container.grid_propagate(False) 
     toolbar.pack(side="top", fill="x") 
     container.pack(side="bottom", fill="both", expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 
     text = tk.Text(container, font="TextFont") 
     text.grid(row=0, column=0, sticky="nsew") 

     zoomin = tk.Button(toolbar, text="+", command=self.zoom_in) 
     zoomout = tk.Button(toolbar, text="-", command=self.zoom_out) 
     zoomin.pack(side="left") 
     zoomout.pack(side="left") 

     text.insert("end", '''Press te + and - buttons to increase or decrease the font size''') 

    def zoom_in(self): 
     font = tkFont.nametofont("TextFont") 
     size = font.actual()["size"]+2 
     font.configure(size=size) 

    def zoom_out(self): 
     font = tkFont.nametofont("TextFont") 
     size = font.actual()["size"]-2 
     font.configure(size=max(size, 8)) 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
+0

me refiero a la grid_propagate que no trabaja con el widget de texto. Técnicamente funciona, pero aún se expande porque su ancho está en caracteres, por lo que mantiene la misma longitud en caracteres, pero no todos los tamaños de caracteres son iguales. El widget de texto no llena mi ventana completa, quería que hubiera espacio para agregar botones más adelante. El problema es que el widget de "Texto" real sigue cambiando de tamaño para satisfacer las necesidades de cada una de las fuentes. Parece tonto cuando se escribe algo y se cambia la fuente y se ve cómo el widget de texto se expande y se contrae. – reallycoolnerd

+0

@reallycoolnerd: Lo siento, pero es incorrecto acerca de 'grid_propagate'. No tiene nada que ver con el atributo de tamaño, tiene todo que ver con el tamaño real del widget. Si puede mostrar el código donde intenta usar 'grid_propagate' y no funciona, podemos solucionarlo. Parece que no entiende cómo funciona 'grid_propagate'. ¿Te das cuenta de que tienes que llamar al padre? No tiene ningún efecto llamar a 'grid_propagate' en el widget de texto. –

+0

@reallycoolnerd: ¿hay algo acerca de mi ejemplo que te resulte confuso? El ejemplo muestra claramente cómo puedo establecer el tamaño del widget de texto en píxeles estableciendo el tamaño de su contenedor y desactivando la propagación de la geometría. Quizás si puedes explicar por qué no entiendes el ejemplo, entonces puedo descubrir cómo mejorarlo. –

Cuestiones relacionadas