board.py 2.88 KB
from PyQt5.QtCore import QDir, QFile, QPoint, QRect, QSize, Qt
from PyQt5.QtGui import QImage, QImageWriter, QPainter, QPen, qRgb, QPixmap
from PyQt5.QtWidgets import (QAction, QApplication, QColorDialog, QFileDialog,
        QInputDialog, QMainWindow, QMenu, QMessageBox, QWidget)

class Board(QWidget):
    def __init__(self,parent=None):
        super(Board,self).__init__(parent)
        self.setAttribute(Qt.WA_StaticContents)
        self.penWidth = 50
        self.writing = False
        self.penColor = Qt.black
        self.image = QImage()
        self.lastPoint = QPoint()
        self.setFixedSize(512,512)

    def saveImage(self,label):
        import os
        visibleImage = self.image
        self.resizeImage(visibleImage,self.size())
        if QDir('Image').exists() == False:
            QDir().mkdir('Image')

        label = 'Image/'+label
        if QDir(label).exists() == False:
            QDir().mkdir(label)
        cnt = 0
        maxf = 0
        for file in os.listdir(label):
            if file.endswith('.bmp'):
                cnt += 1
                tmpN = int(file[:-4:])
                maxf = max(maxf,tmpN)
        visibleImage.save('tmp.bmp')
        pixmap = QPixmap('tmp.bmp').scaled(8,8)
        pixmap.save(label+'/'+str(max(cnt,maxf)+1)+'.bmp')
        QFile.remove('tmp.bmp')
        

    def paintEvent(self, event):
        painter = QPainter(self)
        dirtyRect = event.rect()
        painter.drawImage(dirtyRect, self.image, dirtyRect)

    def clearImage(self):
        self.image.fill(qRgb(255,255,255))
        self.update()

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

    def mouseMoveEvent(self,event):
        if (event.buttons() & Qt.LeftButton) and self.writing:
            self.drawLineTo(event.pos())

    def mouseReleaseEvent(self,event):
        if event.button() == Qt.LeftButton and self.writing:
            self.drawLineTo(event.pos())
            self.writing = False

    def resizeEvent(self,event):
        self.resizeImage(self.image,self.size())
        self.update()
        super(Board,self).resizeEvent(event)
    
    def drawLineTo(self, endPoint):
        painter = QPainter(self.image)
        painter.setPen(QPen(self.penColor, self.penWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
        painter.drawLine(self.lastPoint, endPoint)
        self.writing = True

        rad = self.penWidth/2 + 2
        self.update(QRect(self.lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad))
        self.lastPoint = QPoint(endPoint)

    def resizeImage(self,image, newSize):
        if image.size() == newSize:
            return
        newImage = QImage(newSize, QImage.Format_RGB32)
        newImage.fill(qRgb(255,255,255))
        painter = QPainter(newImage)
        painter.drawImage(QPoint(0,0), image)
        self.image = newImage