본문 바로가기
PYTHON(파이썬)/TKINTER & KIVY

kivy로 윈도우용 GUI 구현하기

by eplus 2024. 10. 29.
from random import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Ellipse, Line


class MyPaintWidget(Widget):

    def on_touch_down(self, touch):
        color = (random(), 1, 1)
        with self.canvas:
            Color(*color, mode='hsv')
            d = 30.
            Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
            touch.ud['line'] = Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]


class MyPaintApp(App):

    def build(self):
        parent = Widget()
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Clear')
        clearbtn.bind(on_release=self.clear_canvas)
        parent.add_widget(self.painter)
        parent.add_widget(clearbtn)
        return parent

    def clear_canvas(self, obj):
        self.painter.canvas.clear()


if __name__ == '__main__':
    MyPaintApp().run()

ChatGPT가 분석한 내용

이 코드는 `Kivy`라는 Python GUI 라이브러리를 사용하여 간단한 그림 그리기 애플리케이션을 만드는 것입니다. 코드의 구성 요소를 분석해보면 다음과 같습니다:

### 주요 컴포넌트
1. **라이브러리 임포트**
   ```python
   from random import random
   from kivy.app import App
   from kivy.uix.widget import Widget
   from kivy.uix.button import Button
   from kivy.graphics import Color, Ellipse, Line
   ```
   - `random`: 무작위 색상 생성을 위해 사용됩니다.
   - `kivy.app.App`: Kivy 애플리케이션을 만드는 기본 클래스입니다.
   - `kivy.uix.widget.Widget`: 사용자 인터페이스의 기본 구성 요소입니다.
   - `kivy.uix.button.Button`: 화면에 추가할 버튼을 정의합니다.
   - `kivy.graphics`: 그래픽 요소 (색상, 타원, 선 등)를 그리기 위해 사용됩니다.

2. **MyPaintWidget 클래스**
   ```python
   class MyPaintWidget(Widget):
   ```
   - 이 클래스는 사용자로부터의 터치를 감지하고, 화면에 선과 타원을 그리기 위한 주요 위젯입니다.

   #### 메서드 설명:
   - **`on_touch_down(self, touch)`**:
     - 사용자가 화면을 터치했을 때 호출됩니다.
     - `random()`을 사용하여 무작위 색상을 생성하고, 그 색상으로 타원을 그립니다.
     - 타원의 중심은 터치한 위치에 배치됩니다.
     - 선(Line)도 생성되며, 이 선은 나중에 사용자가 화면에서 손을 움직일 때 이어집니다.
   - **`on_touch_move(self, touch)`**:
     - 사용자가 손을 대고 움직일 때 호출됩니다.
     - 터치가 움직이는 동안 선의 끝점이 업데이트되어, 사용자가 터치를 이동하는 경로를 따라 선을 그리게 됩니다.

3. **MyPaintApp 클래스**
   ```python
   class MyPaintApp(App):
   ```
   - 애플리케이션의 메인 클래스입니다.
   - 이 클래스는 애플리케이션의 사용자 인터페이스를 구축하고 관리합니다.

   #### 메서드 설명:
   - **`build(self)`**:
     - `build()` 메서드는 Kivy 애플리케이션의 루트 위젯을 생성하고 반환합니다.
     - `parent`라는 기본 위젯을 생성하고, 그 위젯에 그림을 그리는 `MyPaintWidget`과 버튼을 추가합니다.
     - **Clear 버튼**은 사용자가 그린 내용을 지우기 위한 버튼으로, `clear_canvas()` 메서드와 연결되어 있습니다.
   - **`clear_canvas(self, obj)`**:
     - 이 메서드는 'Clear' 버튼이 눌렸을 때 호출되며, 그림판 위젯의 캔버스를 지워서 모든 그린 내용을 삭제합니다.

### 동작 과정
1. **애플리케이션 시작**: `MyPaintApp().run()` 호출을 통해 애플리케이션이 실행됩니다.
2. **사용자 상호작용**:
   - 사용자가 화면을 터치하면 `on_touch_down()` 메서드가 호출되어 무작위 색상으로 타원을 그리고 선을 시작합니다.
   - 사용자가 화면에서 손을 움직이면 `on_touch_move()` 메서드가 호출되어 손이 지나가는 경로에 선이 그려집니다.
3. **캔버스 지우기**:
   - 'Clear' 버튼을 누르면 `clear_canvas()` 메서드가 호출되어 캔버스를 지우고 그림판을 초기화합니다.

### 요약
이 코드는 터치 이벤트를 기반으로 그림을 그릴 수 있는 간단한 그림판 애플리케이션입니다. 터치를 하면 타원이 그려지고, 손을 움직이면 선을 이어 그리며, 'Clear' 버튼을 통해 모든 그림을 지울 수 있습니다. Kivy의 다양한 위젯과 그래픽 도구를 사용하여 이러한 기능을 쉽게 구현하고 있습니다.

728x90
반응형

'PYTHON(파이썬) > TKINTER & KIVY' 카테고리의 다른 글

Google Sheet 사용 (credentials.json)  (0) 2024.10.30
kivy & opencv (camera & cctv)  (2) 2024.10.29
GUI 툴 kivy란? (크로스 플랫폼)  (9) 2024.10.29
tkinter를 APP로 전환은?  (1) 2024.10.29
tkinter & opencv  (0) 2024.10.29