Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Tkinter 캔버스에서 직사각형을 투명하게 만드는 방법

캔버스(Canvas) 위젯은 Tkinter 라이브러리에서 가장 다재다능한 위젯 중 하나입니다. 일반적으로 도형을 그리거나, 객체를 애니메이션으로 표현하거나, 애플리케이션 안에 복잡한 그래픽을 구성할 때 사용됩니다. 직사각형 같은 도형을 만들 때는 create_rectangle(x, y, x+width, y+height, **options) 메서드를 활용하며, width(너비), height(높이), fill(채우기 색상), bg(배경색), borderwidth(테두리 두께) 등의 속성을 추가해 캔버스 항목을 자유롭게 설정할 수 있습니다.

Tkinter에 알파(투명도) 속성이 없는 이유

캔버스 항목의 투명도를 정의하는 속성은 바로 alpha입니다. 그러나 아쉽게도 Tkinter 라이브러리에는 이 속성이 기본적으로 제공되지 않습니다. 따라서 도형에 투명도를 적용하려면 별도의 함수를 직접 정의해야 합니다.

투명도 속성을 지원하는 함수를 만드는 절차는 다음과 같습니다.

  • 내장 함수 형태로 create_rectangle(x, y, a, b, **options) 함수를 정의합니다.
  • 도형에 적용할 각 색상(RGB)의 alpha 값을 계산합니다.
  • pop() 메서드를 사용해 옵션에 미리 정의된 alpha 값이 있다면 제거합니다.
  • winfo_rgb()로 해당 영역의 색상 값을 계산한 뒤, 여기에 alpha 값을 더해 도형에 적용합니다.
  • 새로 생성된 도형은 기존 배경과 다른 색상을 가지므로, 반드시 이미지 형태로 처리해야 합니다.
  • 생성된 이미지는 캔버스에 손쉽게 표시할 수 있습니다.

예제 코드

# 필요한 라이브러리 임포트
from tkinter import *
from PIL import Image, ImageTk

# tkinter 프레임 인스턴스 생성
win = Tk()

# tkinter 윈도우 크기 설정
win.geometry("700x350")

# 새로 생성한 이미지를 저장할 리스트
images = []

# 투명한 직사각형을 만드는 함수 정의
def create_rectangle(x, y, a, b, **options):
    if 'alpha' in options:
        # 모든 색상(RGB)에 대한 알파 투명도 계산
        alpha = int(options.pop('alpha') * 255)
        # fill 변수를 사용해 도형에 반투명 색상 적용
        fill = options.pop('fill')
        fill = win.winfo_rgb(fill) + (alpha,)
        image = Image.new('RGBA', (a - x, b - y), fill)
        images.append(ImageTk.PhotoImage(image))
        canvas.create_image(x, y, image=images[-1], anchor='nw')
        canvas.create_rectangle(x, y, a, b, **options)

# 캔버스 위젯 추가
canvas = Canvas(win)

# 캔버스에 직사각형 생성
create_rectangle(50, 110, 300, 280, fill="blue", alpha=.3)
create_rectangle(40, 90, 420, 250, fill="red", alpha=.1)
canvas.pack()

win.mainloop()

실행 결과

위 코드를 실행하면 캔버스 안에 여러 개의 반투명한 직사각형이 겹쳐져 표시됩니다. 파란색과 빨간색 직사각형이 서로 다른 알파 값으로 렌더링되어, 마치 유리처럼 비칠 듯한 투명 효과를 확인할 수 있습니다.

Tkinter 캔버스에서 직사각형을 투명하게 만드는 방법