PyQt & Animated Gif Macerası..

Python – PyQt birlikteliğinden swf oynatma yeteneği çıkmayınca geliştirdiğim uygulamada dinamik olarak güncellenebilen bir alanda animated gif oynatmaya karar verdik. Qt ile bunun oluru nedir diye baktığımda pek de zor olmadığını gördüm.

Özetle şöyle:
Önce bir QMovie nesnesi oluşturuyorsunuz, oynatacağınız gif’i QMovie nesnesini oluştururken belirtiyorsunuz. Daha sonra bir QLabel oluşturup setMovie metoduna oluşturduğunuz QMovie nesnesini veriyorsunuz. Son olarak oluşturduğunuz QMovie nesnesinin start() metodunu çağırarak gif’i oynatıyorsunuz. Mantık olarak çok basit olmakla birlikte bir türlü çalıştıramadım. Hata da vermiyor, bir derdi var belli, çok da küçük bişey ama bir türlü göremiyorum. Deneme için oluşturduğum kod aşağıda, oynatmaya çalıştığım gif dosyası da burada. Programı deneyip sonucu bana bildirirseniz çok sevinirim.

Çalıştığım sistem özellikleri:

Pardus 2008.2
PyQt 4.4.4

Cevap:
Aşağıdaki kodda bulunan movie nesnesini self‘e bağlayınca çalıştı. QMovie nesnesinin neden class’a bağlı global bir değişken olarak tanımlanması gerektiğini anlamış değilim. Bu örnek de böyle bir hatayla karşılaşanlar olursa diye dursun burada.

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
 
class Ui_MainWindow(object):
   def setupUi(self, MainWindow):
      MainWindow.setObjectName("MainWindow")
      MainWindow.resize(800, 600)
      self.centralwidget = QtGui.QWidget(MainWindow)
      self.centralwidget.setObjectName("centralwidget")
      self.label = QtGui.QLabel(self.centralwidget)
      self.label.setGeometry(QtCore.QRect(210, 90, 351, 231))
      movie = QtGui.QMovie("progress.gif")
      self.label.setMovie(movie)
      movie.start()
 
      """
 
      ** PyQt sürümünüzün gif destegi olup olmadigini commentleri kaldirarak gorebilirsiniz
 
      formats = QtGui.QImageReader.supportedImageFormats ()
      for i in formats:
         print i
 
      """
 
      self.label.setObjectName("label")
      MainWindow.setCentralWidget(self.centralwidget)
      self.menubar = QtGui.QMenuBar(MainWindow)
      self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
      self.menubar.setObjectName("menubar")
      MainWindow.setMenuBar(self.menubar)
      self.statusbar = QtGui.QStatusBar(MainWindow)
      self.statusbar.setObjectName("statusbar")
      MainWindow.setStatusBar(self.statusbar)
 
      self.retranslateUi(MainWindow)
      QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
   def retranslateUi(self, MainWindow):
      MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
 
if __name__ == "__main__":
   app=QtGui.QApplication(sys.argv)
   window=QtGui.QMainWindow()
   ui=Ui_MainWindow()
   ui.setupUi(window)
   window.show()
   sys.exit(app.exec_())