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를 사용하여 자신만의 그림판 애플리케이션을 만들어보세요!
'프로그래밍 > python' 카테고리의 다른 글
PyQt5로 간단한 화면 캡처 프로그램 만들기 (0) | 2024.06.13 |
---|---|
PyQt5로 구글 번역기 프로그램 만들기 (0) | 2024.06.12 |
PyQt5 시그널과 슬롯: GUI 이벤트 처리의 핵심 (0) | 2024.06.11 |
PyQt5 QMessageBox 상세한 사용법 (0) | 2024.06.09 |
PyQt5 QFileDialog 상세한 사용법 (0) | 2024.06.09 |