mirror of
https://github.com/serialexperiments0815/PythonJigsaw01.git
synced 2026-07-12 15:32:26 +00:00
99 lines
No EOL
3.3 KiB
Python
99 lines
No EOL
3.3 KiB
Python
from PyQt5.QtWidgets import (
|
|
QGraphicsScene, QGraphicsPixmapItem, QMessageBox
|
|
)
|
|
from PyQt5.QtGui import QPixmap, QImage
|
|
from PyQt5.QtCore import Qt
|
|
from PIL import Image
|
|
import random
|
|
|
|
class JigsawPiece(QGraphicsPixmapItem):
|
|
|
|
number = 0
|
|
|
|
def __init__(self, pixmap, correctPos):
|
|
super().__init__()
|
|
self.setPixmap(pixmap)
|
|
self.correctPos = correctPos
|
|
self.setFlags(
|
|
QGraphicsPixmapItem.ItemIsMovable |
|
|
QGraphicsPixmapItem.ItemIsSelectable
|
|
)
|
|
self.setPos(0, 0)
|
|
JigsawPiece.number += 1
|
|
self.number = JigsawPiece.number
|
|
self.cluster = {self}
|
|
|
|
def mousePressEvent(self, event):
|
|
if event.button() == Qt.LeftButton:
|
|
self.dragPosition = event.pos()
|
|
print(event.pos(), self.correctPos, " ", self.number)
|
|
|
|
def mouseMoveEvent(self, event):
|
|
if event.buttons() == Qt.LeftButton and self.dragPosition:
|
|
delta = self.mapToParent(event.pos()) - self.dragPosition - self.pos()
|
|
for piece in self.cluster:
|
|
piece.setPos(piece.pos() + delta)
|
|
|
|
|
|
def mouseReleaseEvent(self, event):
|
|
if event.button() == Qt.LeftButton:
|
|
firstRow = 0
|
|
lastRow = (PuzzleWindow.getRows)
|
|
print(firstRow, lastRow)
|
|
if (self.number):
|
|
None
|
|
|
|
|
|
class PuzzleWindow(QGraphicsScene):
|
|
def __init__(self, filePath, rows, cols):
|
|
super().__init__()
|
|
self.filePath = filePath
|
|
self.rows = rows
|
|
print(self.rows-1)
|
|
self.cols = cols
|
|
print(self.cols-1)
|
|
if (filePath != None):
|
|
|
|
self.createPuzzle(rows, cols)
|
|
|
|
def createPuzzle(self, rows, cols):
|
|
image = Image.open(self.filePath)
|
|
w, h = image.size
|
|
pieceW, pieceH = w // cols, h // rows
|
|
|
|
|
|
|
|
if (w >= 800 and h >= 800):
|
|
msg = QMessageBox()
|
|
msg.setWindowTitle("Error")
|
|
msg.setText("Only image below the height 800 and width 800 are supported\n"
|
|
f"Current image width: {w}\n"
|
|
f"Current image height: {h}")
|
|
msg.setIcon(QMessageBox.Information)
|
|
msg.exec_()
|
|
else:
|
|
|
|
|
|
for i in range(rows):
|
|
for j in range(cols):
|
|
|
|
box = (j*pieceW, i*pieceH, (j+1)*pieceW, (i+1)*pieceH)
|
|
pieceImg = image.crop(box)
|
|
width, height = pieceImg.width, pieceImg.height
|
|
data = pieceImg.tobytes("raw", "RGB")
|
|
qimage = QImage(data, width, height, 3 * width, QImage.Format_RGB888)
|
|
pixmap = QPixmap.fromImage(qimage)
|
|
piece = JigsawPiece(pixmap, (j*pieceW, i*pieceH))
|
|
print(f"Piecenumber: {piece.number} | Row: {i} Col: {j} | H: {pieceImg.height} W: {pieceImg.width}")
|
|
|
|
piece.setPos(random.randint(0, w-pieceW), random.randint(0, h-pieceH))
|
|
self.addItem(piece)
|
|
piece.setPos(random.randint(0, int(self.width()-pieceW)), random.randint(0, int(self.height()-pieceH)))
|
|
print("1111")
|
|
|
|
def getRows(self):
|
|
return self.rows
|
|
|
|
def getCols(self):
|
|
return self.cols
|
|
|