2017-05-21 4 views

답변

5

tobias의 방법에 대한 대체 접근 방식을 제공하는 것은 실제로 하나의 다각형으로 수행하는 것입니다.

최적화에 대해 걱정하거나 단일 객체를 참조하는 태그 시스템에 대해 걱정할 필요가없는 경우 하나의 캔버스 객체가 될 수 있다는 장점이 있습니다.

코드는 조금 더 길지만 매우 기본입니다. 폴리곤을 다듬을 때 똑같은 좌표를 두 번 주어서 발생하지 않도록 부드럽게 할 수 있다는 아이디어를 사용하고 있습니다. 당신은 당신이 사각형으로, 다음에 둥글게되어있는 '반경'을 지정합니다 일반 좌표를 제공 할 수있는이 기능을 사용

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 줄 (!)으로 만들 수 있습니다.

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) 

이이 (마음이 하나 캔버스 객체를 주) 다음을 생성합니다 :처럼이 보인다

Rounded rectangle produced by function

+1

내가이 너무 좋아 보인다 놀랍군요. 내가 똑같은 것을 시도했을 때, 내가 낡은 TV처럼 말했다. 그러나 나는 20 점이 아닌 12 점만을 사용하고있었습니다. +1 IMHO는 명시 적으로 'x1, y1, x2, y2'또는 'x, y, w, h'매개 변수를 사용하는 것이 좋습니다. –

+1

@tobias_k 나는이 방법의 트릭이 각면에 포인트를주고 있다고 생각한다. 또한 나는 'x1, y1, x2, y2' 제안에 대해 동의합니다. – SneakyTurtle

3

기본 제공 방법이없는 것 같습니다. 가장 가까운 것은 폴리선이 smooth=1인데도 여전히 오래된 TV 화면처럼 보입니다. 측면이 약간 구부러져 있습니다.

대신, 선과 호에서 둥근 사각형을 결합 도우미 함수를 정의 할 수 있습니다 :

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). 또한 채워진 둥근 사각형을 원한다면 여러 사각형을 사용하여 두 번째 방법으로 지정해야합니다.