使用tkinter canvas在python中创建空心圆柱体或管道

时间:2017-01-01 22:53:34

标签: python canvas tkinter

我正在使用画布在tkinter中创建一个简单的CAD应用程序。通过使用两个椭圆形物体创建空心圆柱体,如下面的示例代码所示。内圆/椭圆与画布的背景具有相同的填充,从而产生空心物体的幻觉。

如果我将圆柱体绘制在另一个具有不同填充的对象上(如矩形所示),则会丢失空心效果。

无法知道将在画布上创建的每个对象的颜色,或者用户可能在一个点创建一个圆柱体并将其移动到另一个位置/在具有不同填充颜色的不同对象上。 / p>

在这些情况下如何创建空心物体?

示例代码:

import Tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=350, background="RoyalBlue4")
canvas.pack()

#Plot on the canvas
def cylinder(OD, ID):
    canvas.create_oval(OD, outline="black", fill="SkyBlue1")
    canvas.create_oval(ID, outline="black", fill="RoyalBlue4")

def rectangle(dim):
    canvas.create_rectangle(dim, outline="black", fill="white")


rectangle([10, 10, 250, 150])
cylinder([75, 30, 175, 130], [85, 40, 165, 120])

cylinder([150, 200, 250, 300], [175, 225, 225, 275])

root.mainloop()

1 个答案:

答案 0 :(得分:1)

你需要获得至少在圆柱体中心下方的像素的颜色。在没有get_pixel_color方法的情况下,我想出了你的柱面函数的这个扩展。

def cylinder(OD, ID):
    x, y = (ID[0]+ID[2])/2, (ID[1]+ID[3])/2
    under = canvas.find_overlapping(x, y, x, y)
    fillcolor = canvas.itemcget(under[0], 'fill') if under else "RoyalBlue4"
    print('x, y, under, color = ', x, y, under, fillcolor)
    canvas.create_oval(OD, outline="black", fill="SkyBlue1")
    canvas.create_oval(ID, outline="black", fill=fillcolor)

应该命名画布背景颜色,并在此处和画布中使用名称create语句。开发需要打印。

如果圆柱体下面有多个项目,则必须尝试查看顶部是第一个(如上所述)还是最后一个(在这种情况下,使用-1而不是0)。 (希望订单不是随机的。)如果一个圆柱体部分重叠,你需要一个透明的颜色(不可用,至少来自tkinter)或更精细的东西。