我正在try 添加对画布小部件内部放大和缩小的支持,它既包含文本元素(使用create_text
创建),也包含非文本元素,如矩形(使用create_rectangle
创建)等.
到目前为止,我使用了this one">this answer和this one的一部分进行了以下MRE:
import tkinter as tk
from tkinter.font import Font
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
font = Font(family="Arial", size=10)
fontsize = 10
# Add elements to canvas
rectangle = canvas.create_rectangle(100, 100, 300, 200, fill='red')
oval = canvas.create_oval(150, 150, 250, 250, fill='blue')
text = canvas.create_text(200, 175, text="Hello", font=font)
def do_zoom(event):
global fontsize
x = canvas.canvasx(event.x)
y = canvas.canvasy(event.y)
factor = 1.001 ** event.delta
if (event.delta > 0):
fontsize *= 1.1
font.configure(size=int(fontsize))
elif (event.delta < 0):
fontsize *= 0.9
font.configure(size=int(fontsize))
canvas.scale("all", x, y, factor, factor)
canvas.bind("<MouseWheel>", do_zoom)
canvas.bind('<ButtonPress-1>', lambda event: canvas.scan_mark(event.x, event.y))
canvas.bind("<B1-Motion>", lambda event: canvas.scan_dragto(event.x, event.y, gain=1))
root.mainloop()
这看起来很管用,但有一两个问题:
- 一旦字体大小达到浮点数的
0
或0.0???
(缩小时),字体大小与字体的实际视觉大小不匹配,因为它似乎固定在更大的大小(可以在this gif here上看到) - 当以足够快的速度反复放大和缩小时,在前一个鼠标滚轮滚动和下一个鼠标滚轮滚动时(可以通过打印字体大小看到),可以看到字体大小的差异.
简而言之,我想知道是否有办法解决上述问题(以及它们发生的原因,除了我自己的猜测之外),或者是否有更好的方法来处理这一问题.