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())