from PyQt5.QtCore import Qt, QDir, QFile, QPoint, QRect, QSize from PyQt5.QtWidgets import QWidget, QPushButton, QLineEdit, QLabel, QGridLayout from PyQt5.QtGui import QImage, QImageWriter, QPainter, QPen, qRgb, QPixmap class Button(QWidget): def __init__(self,parent=None, label="Button", on_click=None): super(Button,self).__init__(parent) button = QPushButton(label, self) button.move(220,0) button.clicked.connect(on_click) grid = QGridLayout() grid.addWidget(button,1,0,1,2) self.setLayout(grid) class ComboWidget(QWidget): def __init__(self, parent=None, text_on_label="Label", text_on_button="button", on_click=None, readOnly=False): super(ComboWidget,self).__init__(parent) button = QPushButton(text_on_button, self) lbl = QLabel(self) lbl.setText(text_on_label) self.qle = QLineEdit(self) self.qle.setReadOnly(readOnly) self.qle.setAlignment(Qt.AlignCenter) button.clicked.connect(on_click) grid = QGridLayout() grid.addWidget(lbl,1,0) grid.addWidget(self.qle,1,1) grid.addWidget(button,1,2) self.setLayout(grid) def text(self): return self.qle.text() def set_text(self, text=""): self.qle.setText(text) 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