我正在使用画布在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()
答案 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)或更精细的东西。