2017-05-21 211 views

答えて

5

tobiasの方法に対する代替アプローチを提供することは、実際には1つのポリゴンで行うことです。

これは、最適化が心配されている場合、または単一のオブジェクトを参照するためのタグシステムについて心配する必要がない場合、キャンバスオブジェクトの1つであるという利点があります。

コードは少し長くなりますが、ポリゴンをスムージングするときに、同じ座標を2回与えてスムージングを「停止」するというアイデアを利用しているので、基本的です。 、あなたはちょうどあなたが長方形にし、その後に丸められる「半径」を指定することになり、通常の座標を提供することができ、この機能を使用する

from tkinter import * 
root = Tk() 
canvas = Canvas(root) 
canvas.pack() 

def round_rectangle(x1, y1, x2, y2, radius=25, **kwargs): 

    points = [x1+radius, y1, 
       x1+radius, y1, 
       x2-radius, y1, 
       x2-radius, y1, 
       x2, y1, 
       x2, y1+radius, 
       x2, y1+radius, 
       x2, y2-radius, 
       x2, y2-radius, 
       x2, y2, 
       x2-radius, y2, 
       x2-radius, y2, 
       x1+radius, y2, 
       x1+radius, y2, 
       x1, y2, 
       x1, y2-radius, 
       x1, y2-radius, 
       x1, y1+radius, 
       x1, y1+radius, 
       x1, y1] 

    return canvas.create_polygon(points, **kwargs, smooth=True) 

my_rectangle = round_rectangle(50, 50, 150, 100, radius=20, fill="blue") 

root.mainloop() 

この

は何ができるかの例です。角。 **kwargsを使用すると、普通は create_メソッドと同様に、 fill="blue"などのキーワード引数を渡すことができます。

コーディングは複雑に見えますが、コーナーが複雑に見えますが、「矩形」内の各ポイントに体系的に移動して、コーナー以外のポイントを2度与えます。

長いコード行に気にしない場合は、すべての座標を1行に入れて、関数を2行(!)にするだけです。これは次のようになります。

def round_rectangle(x1, y1, x2, y2, r=25, **kwargs):  
    points = (x1+r, y1, x1+r, y1, x2-r, y1, x2-r, y1, x2, y1, x2, y1+r, x2, y1+r, x2, y2-r, x2, y2-r, x2, y2, x2-r, y2, x2-r, y2, x1+r, y2, x1+r, y2, x1, y2, x1, y2-r, x1, y2-r, x1, y1+r, x1, y1+r, x1, y1) 
    return canvas.create_polygon(points, **kwargs, smooth=True) 

これは(これはONEキャンバスオブジェクトである念頭に注意してください)以下を生成します。

Rounded rectangle produced by function

+1

私は、これはとてもよさそう驚いて。私が同じことをしようとすると、私は古いテレビのように、まっすぐなエッジが少し外側に曲がっていました。しかし、私は20点ではなく12点しか使用していませんでした.1 IMHOは、明示的な 'x1、y1、x2、y2'または' x、y、w、h'パラメータを使う方が良いでしょう。 –

+1

@tobias_k私は、この方法のトリックは両側にポイントを与えていると思います(角から離れた '半径')ので、滑らかではありません。また、編集した 'x1、y1、x2、y2'の提案についても同意します。 – SneakyTurtle

3

これには組み込みの方法がないようです。最も近いのはsmooth=1のポリラインですが、それでも古いテレビ画面のように見え、側面もやや湾曲しています。

代わりに、あなたはラインや円弧から角丸長方形を組み合わせて、ヘルパー関数を定義することができます。

def rounded_rect(canvas, x, y, w, h, c): 
    canvas.create_arc(x, y, x+2*c, y+2*c, start= 90, extent=90, style="arc") 
    canvas.create_arc(x+w-2*c, y+h-2*c, x+w, y+h, start=270, extent=90, style="arc") 
    canvas.create_arc(x+w-2*c, y, x+w, y+2*c, start= 0, extent=90, style="arc") 
    canvas.create_arc(x, y+h-2*c, x+2*c, y+h, start=180, extent=90, style="arc") 
    canvas.create_line(x+c, y, x+w-c, y ) 
    canvas.create_line(x+c, y+h, x+w-c, y+h ) 
    canvas.create_line(x, y+c, x,  y+h-c) 
    canvas.create_line(x+w, y+c, x+w, y+h-c) 

例:

import tkinter 
root = tkinter.Tk() 
canvas = tkinter.Canvas(root) 
canvas.pack() 
rounded_rect(canvas, 20, 20, 60, 40, 10) 
root.mainloop() 

enter image description here

あなたはまた、別の**optionsパラメータを提供することができ個々の部品の線幅、色などを設定することができますが、この問題は、たとえばラインとアークは、ラインカラー(filloutlineそれぞれ)に対して異なるパラメータを使用しています。また、塗りつぶした四角形を使用する場合は、複数の四角形を使用して2番目の方法として指定する必要があります。

関連する問題