为托比亚斯的方法提供另一种方法确实是用一个多边形来实现。
如果您担心优化,或者不必担心引用单个对象的标签系统,那么这将具有成为一个画布对象的优点。
该代码有点长,但非常基本,因为它只是利用了这样的想法:在平滑多边形时,您可以给出相同的坐标两次以“阻止”平滑的发生。
这是可以执行的操作的示例:
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)