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

时间:2018-03-14 04:21:54

标签: python tkinter rotation ellipse

我有一个简单的椭圆(红色),我想旋转椭圆。 以下代码仅返回展平椭圆(蓝色)但不旋转:     将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 3.6

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果您查看文档,例如effbot.org,您会发现某些项目是使用第一个position arg(单点,例如text)创建的,有些是使用{ {1}} arg(两个点,例如bboxrectangle),有些包含oval(可变,两个或多个点,例如coords和{{1} }。

您可以旋转line的项目,方法是(1)使用polygon方法来计算新坐标,以及(2)使用新坐标来更新项目。

对于其余项目,您很不走运,除了coords支持coords()属性,您可以使用text设置

但是,所有的希望并没有失去。您可以将angleitemconfig(item, angle=new_angle)转换为rectangle(通过创建新的oval来替换旧的polygon项目,然后您就可以旋转新项目。使用polygon很简单;使用bbox则比较麻烦,因为您必须使用很多rectangle坐标来模拟oval看起来不错。