gpt4 book ai didi

python - 如何制作带圆角的 tkinter Canvas 矩形?

转载 作者:太空狗 更新时间:2023-10-30 01:41:23 25 4
gpt4 key购买 nike

我想创建一个圆角矩形。我正在使用来自 tkinter 的 Canvas 。

最佳答案

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

如果您担心优化,或者不必担心引用单个对象的标签系统,这将具有作为一个 Canvas 对象的优势。

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

这是一个可以做什么的例子:

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_ 一样方法。

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

如果您不介意相当长的代码行,您可以将所有坐标放在一行中,使函数只有 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 对象):

Rounded rectangle produced by function


如果你想在矩形创建后更新它的位置,你可以使用这样的函数(如果在与原始 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)

关于python - 如何制作带圆角的 tkinter Canvas 矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com