ubuwidgets.py 3.96 KB
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