如何在tkinter画布上旋转椭圆?

2024-10-01 09:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的椭圆(红色),我想旋转椭圆。 以下代码仅返回展平椭圆(蓝色),但不旋转: 将tkinter作为tk导入 将numpy作为np导入 导入数学

def rotate(points, angle):
    new_points = list(points)
    rad = angle * (math.pi/180)
    cos_val = math.cos(rad)
    sin_val = math.sin(rad)
    for coords in new_points:
        x_val =  coords[0] 
        y_val = coords[1]
        coords[0] = x_val * cos_val - y_val * sin_val
        coords[1] = x_val * sin_val + y_val * cos_val
    return new_points

window = tk.Tk()
window.geometry("500x300")
canvas = tk.Canvas(window, height=300, width=500)
canvas.grid(row=0, column=0, sticky='w')

# draw ellipse 
size=80
x0,y0=100,100
width,height=0.25*size,0.5*size
x1,y1=x0+width,y0+height
xc=x0+width/2
yc=y0+height/2
ellipse = canvas.create_oval([x0, y0, x1,y1],fill='blue')

#draw rotated ellipse
coord1=canvas.coords(ellipse)
points=[[coord1[0],coord1[1]],[coord1[2],coord1[3]]]
point2=rotate(points,30)
coord2 = [item for sublist in point2 for item in sublist]
ellipse2 = canvas.create_oval(coord2,fill='red')

window.mainloop ()

结果如下:

red and blue ellipse. The blue one is supposed to be rotated

红色椭圆应该旋转30度,但是没有旋转,它只是变平了。在

问:如何在tkinter画布上旋转椭圆?在

注意事项:

  • 使用python-am

  • 我检查了similar question上的stackoverflow,但没有正确的答案。

  • 不像多边形,我们可以简单地旋转每个顶点,椭圆没有顶点。


Tags: valsincoscoordswindowwidthtkpoints
2条回答

我知道有两种方法:1)在椭圆的边缘画出每个点。网上有一些网页展示了如何计算所有点2)保存为图像并使用tkinter的PIL库旋转图像。在

tkinter画布的oval项不能作为oval旋转。在

如果你看看文件,比如effbot.org网站,您将看到一些项是用第一个positionarg(单个点,如text)创建的,有些是用bboxarg(两个点,比如rectangle和{}),还有一些是用coords(变量,两个或多个点,比如line和{})。在

您可以通过(1)计算新坐标和(2)使用coords()方法用新坐标更新项目来旋转coords项。在

对于其余的项目,除了支持text属性的text之外,您可以使用itemconfig(item, angle=new_angle)设置一个angle属性

但并不是所有的希望都破灭了。您可以将rectangleoval转换为polygon(方法是创建一个新的polygon来替换旧的bbox项,然后就可以旋转新项了。有了rectangle,这很容易。对于oval,这要复杂得多,因为您必须使用许多polygon坐标来模拟oval,这样看起来就很好了。在

相关问题 更多 >