tkinter 画布中缩放方法的工作单位是什么?

2024-04-02

试图弄清楚 Tkinter Canvas 包中的缩放方法是如何工作的。

import tkinter

root = tkinter.Tk()
root.geometry("1200x800")
root.resizable(False,False)
root.title("Examples")

myCanvas = tkinter.Canvas(root, bg="white", height=700, width=1000)
myCanvas.create_rectangle(0,200,300,300, tags="myTag")
myCanvas.scale("myTag", 8200,1200,0.99,0.99)

myCanvas.create_rectangle(0,400,300,300, tags="myTag2")
myCanvas.move("myTag2",200,0)

input_elem = tkinter.Entry(root,width=50)
input_elem.grid(row=1, column=0)

btn = tkinter.Button(root,width=50, text="here", height=5)
btn.grid(row=1, column=2)

myCanvas.grid(row=0, column=0)
root.mainloop()

in the 文档 https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/canvas-methods.html我找到了这个:

.scale(tagOrId, xOffset, yOffset, xScale, yScale) 缩放所有对象 根据它们距点的距离 P=(xOffset, yOffset)。这 比例因子 xScale 和 yScale 基于值 1.0,其中 意味着没有缩放。 tagOrId 选择的对象中的每个点都是 移动,使其距 P 的 x 距离乘以 xScale 和 y 距离乘以 yScale。

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

基于此,我预计.scale()以与画布相同的单位(默认像素)工作,但似乎并非如此。我的xOffset值相当大,矩形仅移动很小。因此,我创建了第二个矩形进行比较,并意识到它是根据画布的宽度进行缩放的,因此:

myCanvas.scale("myTag", (20*0.99)*1000,1200,0.99,0.99)
myCanvas.move("myTag2",(0.99*200),0)

等于相同的 xOffset。为什么缩放比例是 10 倍呢?不应该(200*0.99)*1000在缩放方法中等于0.99*200在移动方法中?或者有人可以指出我更详细的文档吗?


我认为理解 Canvas 移动和缩放的最好方法是看到它们的实际效果。

这是一个小型交互式演示,可能会有所帮助。

它在原点绘制一个小矩形(正方形)。

控制移动(拾取和放置)方块只需单击一次按钮

通过键盘控制缩放(向上、向右)= 增大(向下和向左)= 缩小

运行代码,拾取正方形并将其放置在画布中心附近。

按住向上或向右键使其变大。 现在按住向下或向左键使其缩小。

尝试在更改比例时在正方形内部和外部移动鼠标指针。

注意正方形在增长时如何远离鼠标指针 并在缩小时向鼠标指针移动。

这正是人们对接近或远离的物体所期望的。

您可以同时更改比例和移动方块。

这适用于直线、多边形、矩形和椭圆形对象。

import tkinter as tk

class moveScale(tk.Tk):

    def __init__(self):
        super().__init__()

        # Remove various paddings so the entire canvas is visible
        self.canvas = tk.Canvas(
            self, highlightthickness = 0, borderwidth = 0,
            cursor = "crosshair")
        self.canvas.grid(sticky = tk.NSEW)

        self.xx = self.yy = 0 # Store for dynamic mouse pointer position
        self.con = False      # Flag controls move on|off
        self.tag = "myTag"

        self.sU = 1.005       # Scale up (growth)
        self.sD = 1 / self.sU # Scale down (shrink)

        self.canvas.create_rectangle(
            0, 0, 40, 40, fill = "", tags = self.tag)

        # Mouse and Keyboard bindings
        self.canvas.bind("<Motion>", self.mover)
        self.canvas.bind("<Button-1>", self.swap)

        self.canvas.event_add("<<BIG>>", "<Up>", "<Right>")
        self.canvas.event_add("<<GIB>>", "<Left>", "<Down>")

        self.canvas.bind("<<BIG>>", self.big)
        self.canvas.bind("<<GIB>>", self.small)
        # Keyboard input only works when canvas has the focus
        self.canvas.focus_force()

    # Movement control
    def swap(self, ev):
        self.con = self.con == False

    def mover(self, ev):
        x, y = self.canvas.canvasx(ev.x), self.canvas.canvasy(ev.y)
        if self.con:
            self.canvas.move(self.tag, x - self.xx, y - self.yy)
        self.xx, self.yy = x, y

    def big(self, ev):
        self.canvas.scale(self.tag, self.xx, self.yy, self.sU, self.sU)

    def small(self, ev):
        self.canvas.scale(self.tag, self.xx, self.yy, self.sD, self.sD)

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

tkinter 画布中缩放方法的工作单位是什么? 的相关文章

  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐