PyQt6 QGraphicsObject не обновляется

Я использую PyQt6 для реализации простой детской игры «на память»: из сетки плиток игрок переворачивает две щелчком мыши, и если плитки совпадают, эти плитки удаляются из игровой области, и игрок получает еще один ход. Если они не совпадают, ход переходит к следующему игроку.

В моей программе первая плитка пары правильно отображается в «перевернутом» состоянии. При щелчке по второй плитке визуальный переворот не происходит. Я хочу, чтобы обе плитки казались перевернутыми в течение двух секунд, чтобы игрок мог видеть две плитки до того, как плитки перевернутся «лицом вниз» и игра продолжится.

По запросу я отредактировал код, чтобы предоставить минимально воспроизводимый пример:

      from PyQt6 import QtWidgets as qtw
from PyQt6 import QtCore as qtc
from PyQt6 import QtGui as qtg
from time import sleep
import sys


class Tile(qtw.QGraphicsObject):
    click_sig = qtc.pyqtSignal(qtw.QGraphicsObject)

    def __init__(self) -> None:
        super().__init__()
        self.pattern = b'\x1F\x3C\x79\xBF\xFE\x79\x3C\x1F'
        transform = qtg.QTransform().scale(4, 4)
        self.face_bmp = qtg.QBitmap.fromData(qtc.QSize(8, 8), self.pattern).transformed(transform)
        self.back_bmp = qtg.QBitmap.fromData(
            qtc.QSize(8, 8),
            b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF'
        ).transformed(transform)
        self.face_pen = qtg.QPen(qtg.QColor('orange'))
        self.back_pen = qtg.QPen(qtg.QColor('pink'))
        self.bitmap = self.back_bmp
        self.pen = self.back_pen

    def mousePressEvent(self, event) -> None:
        self.flip()
        # emit this object when clicked
        self.click_sig.emit(self)

    def boundingRect(self):
        return qtc.QRectF(0, 0, self.bitmap.width(), self.bitmap.height())

    def paint(self, painter, option, widget):
        painter.setPen(self.pen)
        painter.drawPixmap(0, 0, self.bitmap)

    def flip(self):
        # toggle
        if self.bitmap == self.face_bmp:
            self.bitmap = self.back_bmp
            self.pen = self.back_pen
        else:
            self.bitmap = self.face_bmp
            self.pen = self.face_pen
        self.update()


class Scene(qtw.QGraphicsScene):
    def __init__(self):
        super().__init__()
        tile_1, tile_2 = Tile(), Tile()
        tile_1.setPos(0, 0)
        tile_1.click_sig.connect(self.match_detection)
        self.addItem(tile_1)
        tile_2.setPos(42, 0)
        tile_2.click_sig.connect(self.match_detection)
        self.addItem(tile_2)

        self.flipped_tiles = []

    def match_detection(self, tile) -> None:
        self.flipped_tiles.append(tile)
        if len(self.flipped_tiles) == 2:
            sleep(2)
            if self.flipped_tiles[0].pattern == self.flipped_tiles[1].pattern:
                for tile in self.flipped_tiles:
                    self.removeItem(tile)
                self.flipped_tiles = []
            else:
                # no match. flip the tiles back over
                for tile in self.flipped_tiles:
                    tile.flip()
                self.flipped_tiles = []


class MainWindow(qtw.QMainWindow):
    def __init__(self):
        super().__init__()

        self.resize(qtc.QSize(104, 104))
        self.scene = Scene()
        view = qtw.QGraphicsView(self.scene)
        self.setCentralWidget(view)
        self.show()


if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec())

0 ответов

Другие вопросы по тегам