如何制作带有圆角的 tkinter 画布矩形?

2024-04-16

我想创建一个带圆角的矩形。我正在使用 tkinter 的画布。


为托比亚斯的方法提供另一种方法确实是用一个多边形来实现。

如果您担心优化,或者不必担心引用单个对象的标签系统,那么这将具有成为一个画布对象的优点。

该代码有点长,但非常基本,因为它只是利用了这样的想法:在平滑多边形时,您可以给出相同的坐标两次以“阻止”平滑的发生。

这是可以执行的操作的示例:

from tkinter import *
root = Tk()
canvas = Canvas(root)
canvas.pack()

def round_rectangle(x1, y1, x2, y2, radius=25, **kwargs):
        
    points = [x1+radius, y1,
              x1+radius, y1,
              x2-radius, y1,
              x2-radius, y1,
              x2, y1,
              x2, y1+radius,
              x2, y1+radius,
              x2, y2-radius,
              x2, y2-radius,
              x2, y2,
              x2-radius, y2,
              x2-radius, y2,
              x1+radius, y2,
              x1+radius, y2,
              x1, y2,
              x1, y2-radius,
              x1, y2-radius,
              x1, y1+radius,
              x1, y1+radius,
              x1, y1]

    return canvas.create_polygon(points, **kwargs, smooth=True)

my_rectangle = round_rectangle(50, 50, 150, 100, radius=20, fill="blue")

root.mainloop()

使用此函数,您只需提供矩形的法线坐标,然后指定圆角的“半径”。指某东西的用途**kwargs表示您可以传递关键字参数,例如fill="blue",就像您通常可以使用create_ method.

尽管坐标看起来很复杂,但它只是有条不紊地围绕“矩形”中的每个点,给每个非角点两次。

如果您不介意相当长的一行代码,您可以将所有坐标放在一行上,使该函数只有 2 行(!)。这看起来像:

def round_rectangle(x1, y1, x2, y2, r=25, **kwargs):    
    points = (x1+r, y1, x1+r, y1, x2-r, y1, x2-r, y1, x2, y1, x2, y1+r, x2, y1+r, x2, y2-r, x2, y2-r, x2, y2, x2-r, y2, x2-r, y2, x1+r, y2, x1+r, y2, x1, y2, x1, y2-r, x1, y2-r, x1, y1+r, x1, y1+r, x1, y1)
    return canvas.create_polygon(points, **kwargs, smooth=True)

这会产生以下结果(请注意,这是一个画布对象):


如果你想在创建矩形后更新它的位置,你可以使用这样的函数(如果在与原始矩形相同的范围内)canvas目的):

def update_rectangle_coords(round_rect, x1, y1, x2, y2, r=25):
    points = (x1+r, y1, x1+r, y1, x2-r, y1, x2-r, y1, x2, y1, x2, y1+r, x2, y1+r, x2, y2-r, x2, y2-r, x2, y2, x2-r, y2, x2-r, y2, x1+r, y2, x1+r, y2, x1, y2, x1, y2-r, x1, y2-r, x1, y1+r, x1, y1+r, x1, y1)
    canvas.coords(round_rect, *points)

所以,要更新my_rectangle的位置(来自第一个代码示例),我们可以说:

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

如何制作带有圆角的 tkinter 画布矩形? 的相关文章

随机推荐

  • USB接口条码扫描器

    不完全是一个编程问题 但很接近 无论如何我都会试试运气 The 键盘楔子 扫码机插入 读者之间的翻译装置 和键盘 数据发送通过 楔形看起来就像是被输入的 电脑 而键盘 本身仍保持完整功能 因为电脑使用键盘 楔子无法区分 在输入的数据之间 扫
  • 为什么reinterpret_cast不是constexpr?

    考虑以下片段 static constexpr uint8 t a 0 static constexpr const int8 t b reinterpret cast
  • 由 pandoc 从 .md 转换而来的 Beamer 幻灯片中的绘图非常大

    R 生成的正态图chunksR 中的 Markdown 文件在转换为 html 幻灯片或 pdf 时完全相同 但是 当它们通过以下方式转换为投影仪幻灯片时pandoc t beamer ex md V theme Warsaw o beam
  • SVG路径定位

    我正在制作脸部 SVG 无法将眉毛固定在正确的位置 请指教
  • Ado.Net 实体:对象不显示链接成员(外键)

    我有一个简单的数据库方案 用户 帐户 用户与帐户具有一对多关系 我已经生成了 ado net 实体数据模型 我可以创建用户和帐户 甚至可以将它们链接在一起 在数据库中 account user id 已正确填写 因此理论上我应该能够通过实体
  • 具有 DNS 验证的证书陷入待验证状态

    我已将我的域转移到 Route53 并且我希望 Amazon Certificate Manager 为该域颁发证书 我按照控制台中的步骤颁发证书 确实出现了 在 Route53 中创建记录 按钮 我确实按它 它说 成功 我确实看到在 Ro
  • 如何在numpy中设置最大输出宽度?

    我正在使用 Jupyter 笔记本 我有一个相当宽的屏幕 但是显示的输出 例如 当我打印numpyarray 的格式就像屏幕很窄一样 我找到了一种增加单元格宽度的方法 from IPython core display import HTM
  • 用户主目录中的 log4j 日志文件

    我正在开发一个可以在 OSX 和 Windows 上运行的应用程序 我希望将日志写入用户主目录 对于 OSX 它将位于 Users Library Application Support MyApp log 目录下 而在 Windows 下
  • 有没有可靠的方法来检测 io.js 或 node.js 是否正在运行?

    我可以推断 node js 或 io js 是否正在运行的唯一方法是检查process versions node 在 io js 中 我得到 1 0 4 我确信有更好的方法 有人知道吗 现在最可靠的解决方案是执行node h看看它是否包含
  • 静态元素交互

    我有以下代码 Enabled id gt let removal null if this props disabled removal span gt this onDelete id gt x span return removal 它
  • 新:类型“_InternalLinkedHashMap ”不是类型“DocumentSnapshot”的子类型

    抱歉 我现在正在编程 但我正在学习 请帮助我 我被这个问题困住了 这是我的第一个应用程序 几乎已经完成 因此需要类似的帮助才能完成它 我收到此错误 类型 InternalLinkedHashMap 不是类型 DocumentSnapshot
  • 何时添加组件类与用户控件?

    我有一个总体想法 并且有一些明显的情况 但对我来说也有一些灰色区域 什么时候最好使用从组件扩展以及什么时候最好创建用户控件 这与我试图解决的特定工作问题有关 但具体问题并不重要 这个问题的一般答案对我来说就足够了 在 WPF 和 Windo
  • 链接器错误已定义

    我正在制作一个nodejs插件 我的 Visual Studio 项目中有 5 个文件 comm h cc node main cc util h cc 我将它与图书馆链接node lib node main cc有一个功能 v8 Hand
  • 如何将 SSL 证书添加到 Bluemix java Cloud Foundry 应用程序?

    我正在使用 Spring Boot Java JDK 1 8 Java MongoDB 驱动程序和 MongoDB 开发微服务 我已经在 Bluemix 上创建了 MongoDB 实例 并且正在从 Java 微服务连接到该实例 Bluemi
  • 根据可能不存在于所有值上的分隔符将 pandas 列分成两部分

    我的数据框的一列看起来像这样 application blah 3 14 xyz 5 2 abc 代表软件 版本 我正在努力实现这样的目标 application name ver blah 3 14 blah 3 14 xyz 5 2 x
  • FormBorderStyle为NONE时的表单高度问题

    我有一个无边框表单 FormBorderStyle None 高度为23像素 在设计器中设置 当 NET 在运行时绘制我的表单时 它会绘制它38像素高 由于某种原因它增加了标题栏的高度 MessageBox Show this Height
  • 如何从意图中获取额外的日期?

    我正在打包一个意图 我添加的附加项之一是日期对象 如下所示 intent putExtra DATE EXTRA t getDate 后来 当我阅读附加内容时 我尝试像这样获取日期 this date new Date intent get
  • 修改 Spark RDD foreach 内的集合

    我试图在迭代 RDD 的元素时向映射添加元素 我没有收到任何错误 但修改没有发生 直接添加或迭代其他集合一切正常 scala gt val myMap new collection mutable HashMap String String
  • 将数据库名称设置为 SQL 中的变量

    目前 我正在根据一些业务规则在一个数据库到另一个数据库之间进行一些数据迁移 我正在编写这个巨大的脚本 其中多次引用这两个数据库 问题是这种数据迁移目前正在开发中 在某些时候我将需要在生产中使用两个不同的数据库来完成它 而不是像这样直接引用数
  • 如何制作带有圆角的 tkinter 画布矩形?

    我想创建一个带圆角的矩形 我正在使用 tkinter 的画布 为托比亚斯的方法提供另一种方法确实是用一个多边形来实现 如果您担心优化 或者不必担心引用单个对象的标签系统 那么这将具有成为一个画布对象的优点 该代码有点长 但非常基本 因为它只