2017-01-01 152 views
0

我使用畫布在tkinter中創建簡單的CAD應用程序。空心圓柱體是通過使用兩個橢圓形物體創建的,如下面的示例代碼所示。內圈/橢圓與畫布的背景具有相同的填充,從而形成空心物體的幻覺。使用tkinter畫布在python中創建空心圓柱體或管道

如果我將圓柱體繪製在具有不同填充物的另一個物體上(如矩形所示),中空效應將丟失。

不可能知道將在畫布上創建的每個對象的顏色,或者用戶可能在一個點上創建一個圓柱並將其移動到不同的位置/使用不同的填充顏色在不同的對象上。

如何在這些情況下創建空心物體?

示例代碼:

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

一個很寬的「寬」而且沒有填充的圓圈? –

+0

@ TadhgMcDonald-Jensen感謝您的注意。我嘗試過,但效果不佳。畫布有其他方法,包括移動/滾動,縮放等。當我縮小時,寬度較厚的圓柱體會變成顏色飛濺(可能不是正確的工作)。繪製後,我還必須對圓柱體的尺寸進行一些計算。如果使用厚度較寬的圓(儘管數學更多),仍然可以進行計算。使用'width'的主要問題是對象如何縮放。 – Khristos

回答

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) 

應該命名畫布背景顏色,並在畫布創建語句中使用此名稱。印刷品是發展所需要的。

如果在圓柱體下面有多個項目,您將不得不嘗試查看頂部是第一個(如上面假設的)還是最後一個(在這種情況下,使用-1而不是0)。 (讓我們希望訂單不是隨機的。)如果圓柱體部分重疊,則需要透明顏色(至少從tkinter不可用)或更精細的東西。

+0

我在研究如何處理重疊對象的隨機順序和部分重疊時,現在正在使用它。謝謝。 – Khristos