我正在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()

这看起来很管用,但有一两个问题:

  • 一旦字体大小达到浮点数的00.0???(缩小时),字体大小与字体的实际视觉大小不匹配,因为它似乎固定在更大的大小(可以在this gif here上看到)
  • 当以足够快的速度反复放大和缩小时,在前一个鼠标滚轮滚动和下一个鼠标滚轮滚动时(可以通过打印字体大小看到),可以看到字体大小的差异.

简而言之,我想知道是否有办法解决上述问题(以及它们发生的原因,除了我自己的猜测之外),或者是否有更好的方法来处理这一问题.

推荐答案

这是因为在您的实现中,画布项坐标的zoom 系数和字体大小的zoom 系数是不同的.请记住,Canvas的scale命令的XSCALEYSCALE参数是为重复调用积累的.因为项目的原始坐标转换时存在舍入误差,所以我不建议使用scale()来实现zoom .(例如,请参见the implementation of the polygon.)

无论如何,如果您不介意舍入误差,请这样做.

...
factor = 1.0
def do_zoom(event):
    global factor

    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)

    if (event.delta > 0):
        ratio = 1.1
    elif (event.delta < 0):
        ratio = 0.9
    factor *= ratio

    font.configure(size=int(fontsize*factor))
    canvas.scale("all", x, y, ratio, ratio)
...

Python相关问答推荐

列表上值总和最多为K(以O(log n))的最大元素数

Pandas 都是(),但有一个门槛

将图像拖到另一个图像

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

try 将一行连接到Tensorflow中的矩阵

如何在Python中找到线性依赖mod 2

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

使用groupby方法移除公共子字符串

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

如何在Pyplot表中舍入值

以逻辑方式获取自己的pyproject.toml依赖项

matplotlib图中的复杂箭头形状

从旋转的DF查询非NaN值

关于两个表达式的区别

将链中的矩阵乘法应用于多组值

如何反转一个框架中列的值?

有没有办法在不先将文件写入内存的情况下做到这一点?

极柱内丢失类型信息""

PYTHON中的pd.wide_to_long比较慢

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?