2012-12-24 67 views
0

我剛開始學習PyQT4。PyQT4和瓷磚動畫

如何定義一個類,其實例將是動畫圖像?我有幾個PNG文件,所以我希望這個對象能夠在一個時刻渲染一個這樣的文件,並在其他時刻渲染其他文件。我應該使用QMovie還是Qt動畫框架,還是什麼?謝謝!

回答

0

其實,我發現的東西是更期望對我來說http://python.su/forum/topic/15679/?page=1#post-94136

# -*- coding: utf-8 -*- 
import sys 
import time 

from PyQt4 import QtGui, QtCore 


class SpriteAnimation(object): 
    def __init__(self, image_path, sprite_width, sprite_height, label): 
     pixmap = QtGui.QPixmap(image_path) 

     width, height = pixmap.width(), pixmap.height() 
     self.pixmaps = [] 
     for x in range(0, width, sprite_width): 
      for y in range(0, height, sprite_height): 
       self.pixmaps.append(pixmap.copy(x, y, 
               sprite_width, sprite_height)) 
     self._current_frame = 0 
     self.label = label 

    def play(self, interval=100): 
     self._timer = QtCore.QTimer(interval=interval, 
            timeout=self._animation_step) 
     self._timer.start() 
    def _animation_step(self): 
     self.label.setPixmap(self.pixmaps[self._current_frame]) 
     self.label.update() 
     self._current_frame += 1 
     if self._current_frame >= len(self.pixmaps): 
      self._current_frame = 0 


class Window(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.resize(100, 100) 
     layout = QtGui.QVBoxLayout(self) 
     label = QtGui.QLabel() 
     layout.addWidget(label) 
     # http://content.makeyourflashgame.com/pbe/tutorials/star-green.png 
     self.animation = SpriteAnimation('star-green.png', 80, 80, label) 
     self.animation.play() 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

而且我用這個想法通過以下方式:

class PowerUp(QtGui.QGraphicsRectItem): 
    def __init__(self): 
     QtGui.QGraphicsRectItem.__init__(self) 
     self.images = ['data/images/objects/bonus_block/full-0.png', 
         'data/images/objects/bonus_block/full-1.png', 
         'data/images/objects/bonus_block/full-2.png', 
         'data/images/objects/bonus_block/full-3.png', 
         'data/images/objects/bonus_block/full-4.png'] 
     self.image = self.images[0] 
     self.current = 0 
     self.position() 
     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.animation_step) 
     self.timer.start(175) 
     #random.choice([slide(), ghost()]) 

    def position(self): 
     self.pos_x = random.randint(-300, 300) 
     self.pos_y = random.randint(-200, 200) 

    def boundingRect(self): 
     return QtCore.QRectF(0, 0, 32, 32) 

    def paint(self, painter, option, widget): 
     painter.setBrush(QtGui.QBrush(self.image)) 
     painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) 
     painter.drawRect(0, 0, 32, 32) 
     self.setPos(self.pos_x, self.pos_y) 

    def animation_step(self): 
     self.image = QtGui.QPixmap(self.images[self.current]) 
     self.current += 1 
     if self.current == len(self.images): 
      self.current = 0 
+0

很高興你解決了你的問題。 – doru

0

這個piece of code應該可以幫到你。您應該使用QMovie

+0

謝謝!其實,我不想使用gif。無論如何,我會深入到QMovie。 –