2017-01-01 1 views
0

キャンバスを使用してtkinterで簡単なCADアプリケーションを作成しています。中空円筒は、以下のサンプルコードに示すように、2つの楕円形のオブジェクトを使用して作成されます。内側の円/楕円は、キャンバスの背景と同じ塗りつぶしをしているので、中空のオブジェクトの錯覚を作り出します。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

あなたは円筒の中心の下のピクセルLESTでの色を取得する必要があります。 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文にはこの名前と名前を使用する必要があります。プリントは現像に必要です。

シリンダーの下に複数のアイテムがある場合は、先頭が最初か最後かを調べる必要があります(この場合は0の代わりに-1を使用します)。シリンダーが部分的に重なっている場合は、透明な色(少なくともtkinterからは入手できません)か、もっと精巧なものが必要です。

+0

これは、重複するオブジェクトのランダムな順序と部分的な重なりを処理する方法を研究している間にこれを使用しています。ありがとう。 – Khristos

関連する問題