본문 바로가기
프로그래밍/python

PyQt5로 간단한 그림판 프로그램 만들기

by 마루의 일상 2024. 6. 16.
728x90
반응형

 

 PyQt5를 이용해 간단한 그림판 프로그램을 만드는 방법을 자세히 설명하겠습니다. 이 프로그램은 사용자가 마우스를 드래그하여 그림을 그릴 수 있는 기능을 포함합니다.

단계 1: 기본 설정 및 윈도우 생성

먼저 PyQt5를 사용하여 기본 윈도우를 생성하는 코드부터 시작하겠습니다.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow

class PaintApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("PyQt5 그림판")
        self.setGeometry(100, 100, 800, 600)
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = PaintApp()
    sys.exit(app.exec_())

이 코드는 PyQt5 애플리케이션을 생성하고 기본 윈도우를 설정합니다. PaintApp 클래스는 QMainWindow를 상속받아 윈도우를 초기화합니다.

단계 2: 그림 그리기 기능 추가

이제 마우스를 사용하여 그림을 그릴 수 있도록 기능을 추가하겠습니다. 이를 위해 mousePressEvent, mouseMoveEvent, mouseReleaseEvent를 오버라이드하고, 그림을 그릴 수 있는 캔버스를 설정합니다.

from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel
from PyQt5.QtGui import QPainter, QPen, QPixmap
from PyQt5.QtCore import Qt, QPoint

class PaintApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("PyQt5 그림판")
        self.setGeometry(100, 100, 800, 600)

        self.canvas = QLabel(self)
        self.canvas.setGeometry(0, 0, 800, 600)
        self.canvas.setPixmap(QPixmap(self.canvas.size()))
        self.canvas.pixmap().fill(Qt.white)

        self.drawing = False
        self.lastPoint = QPoint()

        self.show()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = True
            self.lastPoint = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton & self.drawing:
            painter = QPainter(self.canvas.pixmap())
            pen = QPen(Qt.black, 3, Qt.SolidLine)
            painter.setPen(pen)
            painter.drawLine(self.lastPoint, event.pos())
            self.lastPoint = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = PaintApp()
    sys.exit(app.exec_())

이 코드는 사용자가 마우스를 드래그하여 그림을 그릴 수 있도록 설정합니다. QLabel을 사용하여 캔버스를 만들고, QPixmap을 사용하여 그림을

그릴 수 있는 영역을 설정합니다. 마우스 이벤트 핸들러를 오버라이드하여 마우스 클릭, 이동, 릴리즈 이벤트를 처리합니다.

단계 3: 색상 선택 및 브러시 두께 조절 기능 추가

그림판에 색상 선택과 브러시 두께를 조절할 수 있는 기능을 추가해보겠습니다. 이를 위해 QColorDialog와 QSlider를 사용할 것입니다.

 
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QVBoxLayout, QPushButton, QColorDialog, QSlider, QWidget
from PyQt5.QtGui import QPainter, QPen, QPixmap, QColor
from PyQt5.QtCore import Qt, QPoint

class PaintApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("PyQt5 그림판")
        self.setGeometry(100, 100, 800, 600)

        self.canvas = QLabel(self)
        self.canvas.setGeometry(0, 50, 800, 550)
        self.canvas.setPixmap(QPixmap(self.canvas.size()))
        self.canvas.pixmap().fill(Qt.white)

        self.color = Qt.black
        self.brushSize = 3
        self.drawing = False
        self.lastPoint = QPoint()

        self.colorButton = QPushButton('색상 선택', self)
        self.colorButton.setGeometry(10, 10, 100, 30)
        self.colorButton.clicked.connect(self.selectColor)

        self.brushSizeSlider = QSlider(Qt.Horizontal, self)
        self.brushSizeSlider.setGeometry(120, 10, 100, 30)
        self.brushSizeSlider.setMinimum(1)
        self.brushSizeSlider.setMaximum(20)
        self.brushSizeSlider.setValue(self.brushSize)
        self.brushSizeSlider.valueChanged.connect(self.selectBrushSize)

        self.show()

    def selectColor(self):
        color = QColorDialog.getColor()
        if color.isValid():
            self.color = color

    def selectBrushSize(self, value):
        self.brushSize = value

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = True
            self.lastPoint = event.pos() - self.canvas.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton & self.drawing:
            currentPoint = event.pos() - self.canvas.pos()
            painter = QPainter(self.canvas.pixmap())
            pen = QPen(self.color, self.brushSize, Qt.SolidLine)
            painter.setPen(pen)
            painter.drawLine(self.lastPoint, currentPoint)
            self.lastPoint = currentPoint
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = PaintApp()
    sys.exit(app.exec_())

이제 사용자는 색상 선택 버튼을 클릭하여 색상을 선택하고, 슬라이더를 사용하여 브러시 두께를 조절할 수 있습니다.

최종소스

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel
from PyQt5.QtGui import QPainter, QPen, QPixmap
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QVBoxLayout, QPushButton, QColorDialog, QSlider, QWidget
from PyQt5.QtGui import QPainter, QPen, QPixmap, QColor
from PyQt5.QtCore import Qt, QPoint

class PaintApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("PyQt5 그림판")
        self.setGeometry(100, 100, 800, 600)
        self.show()

class PaintApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("PyQt5 그림판")
        self.setGeometry(100, 100, 800, 600)

        self.canvas = QLabel(self)
        self.canvas.setGeometry(0, 0, 800, 600)
        self.canvas.setPixmap(QPixmap(self.canvas.size()))
        self.canvas.pixmap().fill(Qt.white)

        self.drawing = False
        self.lastPoint = QPoint()

        self.show()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = True
            self.lastPoint = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton & self.drawing:
            painter = QPainter(self.canvas.pixmap())
            pen = QPen(Qt.black, 3, Qt.SolidLine)
            painter.setPen(pen)
            painter.drawLine(self.lastPoint, event.pos())
            self.lastPoint = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False


class PaintApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("PyQt5 그림판")
        self.setGeometry(100, 100, 800, 600)

        self.canvas = QLabel(self)
        self.canvas.setGeometry(0, 50, 800, 550)
        self.canvas.setPixmap(QPixmap(self.canvas.size()))
        self.canvas.pixmap().fill(Qt.white)

        self.color = Qt.black
        self.brushSize = 3
        self.drawing = False
        self.lastPoint = QPoint()

        self.colorButton = QPushButton('색상 선택', self)
        self.colorButton.setGeometry(10, 10, 100, 30)
        self.colorButton.clicked.connect(self.selectColor)

        self.brushSizeSlider = QSlider(Qt.Horizontal, self)
        self.brushSizeSlider.setGeometry(120, 10, 100, 30)
        self.brushSizeSlider.setMinimum(1)
        self.brushSizeSlider.setMaximum(20)
        self.brushSizeSlider.setValue(self.brushSize)
        self.brushSizeSlider.valueChanged.connect(self.selectBrushSize)

        self.show()

    def selectColor(self):
        color = QColorDialog.getColor()
        if color.isValid():
            self.color = color

    def selectBrushSize(self, value):
        self.brushSize = value

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = True
            self.lastPoint = event.pos() - self.canvas.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton & self.drawing:
            currentPoint = event.pos() - self.canvas.pos()
            painter = QPainter(self.canvas.pixmap())
            pen = QPen(self.color, self.brushSize, Qt.SolidLine)
            painter.setPen(pen)
            painter.drawLine(self.lastPoint, currentPoint)
            self.lastPoint = currentPoint
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = PaintApp()
    sys.exit(app.exec_())

위 코드를 통해 PyQt5를 사용하여 간단한 그림판 애플리케이션을 만들 수 있었습니다. 이 프로그램은 기본적인 그림 그리기 기능뿐만 아니라 색상 선택 및 브러시 두께 조절 기능을 포함하고 있습니다. PyQt5의 다양한 위젯과 이벤트 핸들링 기능을 활용하여 더 복잡한 기능을 추가할 수 있습니다.

이제 여러분도 PyQt5를 사용하여 자신만의 그림판 애플리케이션을 만들어보세요!

728x90
반응형