代码之家  ›  专栏  ›  技术社区  ›  Shaheryar Ahmed

如何在放大或缩小时更改tkinter画布文本项的大小?

  •  0
  • Shaheryar Ahmed  · 技术社区  · 3 年前

    我试图理解画布的缩放是如何工作的。

    以下面的代码为例。为什么 canvas.scale("all", ...) ,它绑定到鼠标滚轮,缩放所有矩形,而不是文本。

    如何实现文本与矩形的缩放?

    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("<ButtonPress-1>", self.move_start)
            self.canvas.bind("<B1-Motion>", self.move_move)
    
            self.canvas.bind("<ButtonPress-2>", self.pressed2)
            self.canvas.bind("<Motion>", self.move_move2)
    
            #linux scroll
            self.canvas.bind("<Button-4>", self.zoomerP)
            self.canvas.bind("<Button-5>", self.zoomerM)
            #windows scroll
            self.canvas.bind("<MouseWheel>",self.zoomer)
            # Hack to make zoom work on Windows
            root.bind_all("<MouseWheel>",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()
    
    0 回复  |  直到 9 年前
        1
  •  1
  •   Ben Mega    3 年前

    文本的缩放并不是“真正”的文本缩放。是的(至少在 Canvas -(小部件)字体的改变。

    documentation :

    此方法不会更改文本项的大小,但可能会移动它。

    编辑: 这种行为也适用于图像(使用 Tkinter.Canvas.create_image(...) )和windows(使用 Tkinter.Canvas.create_window(...) ).正如文件所定义的,缩放为

    .刻度(泰戈尔、xOffset、yOffset、xScale、yScale)

    根据距离点P=(xOffset,yoOffset)的距离缩放所有对象。比例因子xScale和yScale基于1.0的值,这意味着不进行缩放。 tagOrId选择的对象中的每个点都会被移动,以便其与P的x距离乘以xScale,其y距离乘以yScale。

    请注意 部分原因在于缩放的工作原理。

    结束编辑

    如果要增加字体大小,需要使用 itemconfigure 方法

    要以非常实用的方式实现它,您可以使用 tags 识别所有文本元素。如果你第一次得到fontsize,增加不仅可以是绝对的,也可以是相对的( itemcget )然后根据比例因子增加它。