Tkinter: Escalado de artículos sobre un canvas.

Estaba tratando de entender cómo funciona la escala del canvas.

Tomemos, por ejemplo, el siguiente código. ¿Por qué es que canvas.scale("all", ...) , que está enlazado a la rueda del mouse, está escalando todos los rectangularjs y no el texto también?

¿Cómo puedo lograr escalar el texto junto con los rectangularjs?

 import Tkinter as tk import random pressed = False class Example(tk.Frame): def __init__(self, root): tk.Frame.__init__(self, root) self.canvas = tk.Canvas(self, width=400, height=400, background="bisque") self.xsb = tk.Scrollbar(self, orient="horizontal", command=self.canvas.xview) self.ysb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set) self.canvas.configure(scrollregion=(0,0,1000,1000)) self.xsb.grid(row=1, column=0, sticky="ew") self.ysb.grid(row=0, column=1, sticky="ns") self.canvas.grid(row=0, column=0, sticky="nsew") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) #Plot some rectangles for n in range(50): x0 = random.randint(0, 900) y0 = random.randint(50, 900) x1 = x0 + random.randint(50, 100) y1 = y0 + random.randint(50,100) color = ("red", "orange", "yellow", "green", "blue")[random.randint(0,4)] self.canvas.create_rectangle(x0,y0,x1,y1, outline="black", fill=color, activefill="black", tags=n) self.canvas.create_text(50,10, anchor="nw", text="Click and drag to move the canvas\nScroll to zoom.") # This is what enables using the mouse: self.canvas.bind("", self.move_start) self.canvas.bind("", self.move_move) self.canvas.bind("", self.pressed2) self.canvas.bind("", self.move_move2) #linux scroll self.canvas.bind("", self.zoomerP) self.canvas.bind("", self.zoomerM) #windows scroll self.canvas.bind("",self.zoomer) # Hack to make zoom work on Windows root.bind_all("",self.zoomer) #move def move_start(self, event): self.canvas.scan_mark(event.x, event.y) def move_move(self, event): self.canvas.scan_dragto(event.x, event.y, gain=1) #move def pressed2(self, event): global pressed pressed = not pressed self.canvas.scan_mark(event.x, event.y) def move_move2(self, event): if pressed: self.canvas.scan_dragto(event.x, event.y, gain=1) #windows zoom def zoomer(self,event): if (event.delta > 0): self.canvas.scale("all", event.x, event.y, 1.1, 1.1) elif (event.delta < 0): self.canvas.scale("all", event.x, event.y, 0.9, 0.9) self.canvas.configure(scrollregion = self.canvas.bbox("all")) #linux zoom def zoomerP(self,event): self.canvas.scale("all", event.x, event.y, 1.1, 1.1) self.canvas.configure(scrollregion = self.canvas.bbox("all")) def zoomerM(self,event): self.canvas.scale("all", event.x, event.y, 0.9, 0.9) self.canvas.configure(scrollregion = self.canvas.bbox("all")) if __name__ == "__main__": root = tk.Tk() Example(root).pack(fill="both", expand=True) root.mainloop() 

La escala del texto no es “realmente” una escala del texto. Es (al menos con Canvas -widget) un cambio de fuente.

De la documentación :

Este método no cambiará el tamaño de un elemento de texto, pero puede moverlo.

Edición: este comportamiento también se aplica a las imágenes (creadas con Tkinter.Canvas.create_image(...) ) y windows (creadas con Tkinter.Canvas.create_window(...) ). Como la documentación define la escala como

.scale (tagOrId, xOffset, yOffset, xScale, yScale)

Escale todos los objetos según su distancia desde un punto P = (xOffset, yOffset). Los factores de escala xScale y yScale se basan en un valor de 1.0, lo que significa que no hay escalado. Cada punto en los objetos seleccionados por tagOrId se mueve de manera que su distancia x de P se multiplica por xScale y su distancia y se multiplica por yScale. Tenga en cuenta la parte en cursiva de cómo funciona la escala.

Edición final

Si desea realizar un aumento del tamaño de fuente, debe configurar todos los elementos de texto por sí mismo utilizando el método itemconfigure .

Para implementarlo de una manera muy funcional, podría usar tags para identificar todos los elementos de texto. El aumento puede ocurrir no solo absoluto sino también relativamente si primero obtiene el itemcget ( itemcget ) y luego lo aumenta dependiendo del factor de escala.