Tkinter:缩放画布上的项目

2023-12-10

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

以下面的代码为例。这是为什么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()

文本缩放并不是“真正”的文本缩放。它是(至少与Canvas-widget)更改字体。

来自文档 :

This method will not change the size of a text item, but may move it.

Edit:此行为也适用于图像(使用Tkinter.Canvas.create_image(...))和窗口(使用创建Tkinter.Canvas.create_window(...))。由于文档将缩放定义为

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

根据距点 P=(xOffset, yOffset) 的距离缩放所有对象。缩放因子 xScale 和 yScale 基于值 1.0,这意味着不缩放。 移动 tagOrId 选择的对象中的每个点,使其与 P 的 x 距离乘以 xScale,并且其 y 距离乘以 yScale。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tkinter:缩放画布上的项目 的相关文章

随机推荐

  • Android - 导航抽屉片段

    我已经在我的 Android 应用程序中实现了导航抽屉 但现在我希望能够在用户单击导航栏中的任何列表项时使用片段更改布局 这是我到目前为止所得到的 XML
  • 在 Windows 上可以使用什么来代替 Unix 管道进行进程间通信?

    我有一个启动子进程的应用程序 子进程从标准输入读取要操作的文件 对于某些操作 它需要一个输入文件 其中包含有关如何处理其操作的文件的信息 我们将其称为 控制文件 控制文件的名称也是从 stdin 读取的 父应用程序可以使用临时文件作为控制文
  • 如何在express和bodyParser中接受application/csp-report作为json?

    我正在尝试编写一个中间件来接受来自浏览器的 CSP 报告 浏览器问题application csp report as Content Type 发布的请求是 JSON 格式 目前我使用bodyParser text接受该内容类型 但我想也
  • 记录与数据库通信的 SQL

    我正在为我的 Web 应用程序开发 SQL 记录器 我希望能够记录由用户与 GUI 交互触发的 SQL 查询 我在Spring环境中工作 使用maven和mybatis 我将我的 webapp 打包成一个 war 并将其部署到 tomcat
  • 从 OpenOffice 运行 SWT 应用程序时发生致命错误

    我有一个开发办公室Java 插件应用程序 我正在打电话SWT从一个XActionListener SWT 的加载是使用特殊的类加载器动态完成的 SWT 窗口显示良好 但当我点击 SWT 窗口的关闭按钮时 出现错误 我附上了此错误生成的错误文
  • 如何测试使用 exec_() 调用的自定义对话框窗口?

    我正在尝试为我的项目编写系统测试 我有一个启动各种窗口的控制器类 但是 我似乎无法使用 exec 和 qtbot 来控制 Windows 启动 这是一个 MVCE from PyQt5 QtWidgets import from PyQt5
  • Angular 1.5 组件 $onDestroy 和 $scope.$destroy() 之间的区别

    我想了解控制器之间的区别 onDestroy方法和 scope destroy 定义表明 当需要销毁组件的包含范围时 将调用 onDestroy 但 scope destroy 的情况不是一样吗 根据我创建的 plunkerhttps pl
  • PyQT 中的弹出式、非模态、内联对话框

    很难描述我想在这里做什么 所以这就是我想要的 单击 弹出 对话框的按钮 但是 该对话框应该是非模式的 我还希望它能与父应用程序 锁定 这样如果我移动它 它也会随之而来 看起来我或多或少试图描述一个内联弹出窗口 但我不确定这是否就是它的名字
  • 如何修复我的正则表达式,使其不与贪婪量词匹配太多? [复制]

    这个问题在这里已经有答案了 我有以下几行 14 48 say 0ed673079715c343281355c2a1fde843 2 laka hello 我使用一个简单的正则表达式来解析它 if line d d ssay my ts ha
  • 如何清除mkmapview的缓存

    在我的应用程序中 我有一个文本字段和一个搜索按钮 当用户在文本字段上填写地址后单击搜索按钮时 我的应用程序会显示结果并在地图视图上放置一个图钉 我正在使用谷歌地图 API 我还添加了用户可以拖放图钉的功能 当用户将图钉拖放到另一个地方时 应
  • C++程序设计

    如何有效地设计C 模块化程序 如何学习 对于初学者 您可能想要采取 暴力 过程 1 写一个简单的main函数在一个文件中 2 添加一些功能 编译然后测试 3 重构 在Google中使用这个关键字 以下是一些重构指南 并非所有指南都可以同时适
  • 父进程:子进程已退出,状态为 3221226356 -- 正在重新启动

    我正在 Windows 7 Home Premium 上运行带有 XAMPP 1 8 1 Apache 2 4 3 和 PHP 5 4 7 的测试服务器 昨天一切都运行良好 但今天我开始在 Apache 的 error log 中收到此消息
  • PHP 中的 EVP_BytesToKey 实现

    我一直在尝试在 PHP 中实现与 C 中完全相同的函数 但是 我还没有看到完全相同的结果 我认为问题在于我仍然不完全理解的 计数 或迭代 函数定义 int EVP BytesToKey const EVP CIPHER type const
  • Django Rest Framework:通过 AJAX 上传文件

    我有一个视图和序列化器 class UserView generics RetrieveUpdateAPIView model get user model serializer class UserProfileSerializer pe
  • 运行时与编译时

    运行时和编译时有什么区别 编译时和运行时之间的差异就是尖头理论家所说的一个例子相区别 它是最难学习的概念之一 特别是对于没有太多编程语言背景的人来说 为了解决这个问题 我发现询问很有帮助 程序满足什么不变量 这个阶段可能会出现什么问题 如果
  • KeyListener 未到达我的 switch 语句

    我有这个代码 import java awt Color import java awt Graphics import java awt event KeyEvent import java awt event KeyListener i
  • 在 JavaScript 中选择目录路径[重复]

    这个问题在这里已经有答案了 有没有办法通过 JavaScript 选择目录 不是用于上传文件 只是选择目录路径 目录对话框什么的 出于安全原因 您不能这样做 您不希望网站能够了解您的文件系统 参见下文 当您获取文件输入的值时 它将被破坏 例
  • 所有文档中的成对推土机距离(word2vec 表示)

    是否有一个库可以获取文档列表并集体计算 nxn 距离矩阵 其中提供了 word2vec 模型 我可以看到 genism 允许您在两个文档之间执行此操作 但我需要对所有文档进行快速比较 就像 sklearns cosine similarit
  • PHP获取存储过程的返回值

    我很高兴通过 PDO 使用 SQL Server 来处理旧版 PHP 应用程序 在 PHP 中如何检索正在使用的存储过程的返回值RETURN语句作为输出通道 示例程序 CREATE PROCEDURE dbo mleko test para
  • Tkinter:缩放画布上的项目

    我试图了解画布的缩放是如何工作的 以下面的代码为例 这是为什么canvas scale all 绑定到鼠标滚轮 正在缩放所有矩形 而不是文本 如何实现文本与矩形的缩放 import Tkinter as tk import random p