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
# -*- 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_())
Şubat 17th, 2009 at 13:39
Sorunun “saçma” bir şeyden kaynaklandığını biliyordum, en azından nedenini bilmediğim için bana saçma geliyor hala.
Koddaki “movie” nesnesini self’e bağlayınca çalıştı.
“movie” gördüğünüz kısımları “self.movie” olarak değiştirin.
Nedendir hiç bir fikrim yok, şu an için işimi görüyor ama “neden” kısmı hala geçerliliğini koruyor, bu konuda bilgisi-fikri olan paylaşırsa sevinirim.
Şubat 18th, 2009 at 10:42
Güzel paylaşım +rep
Şubat 18th, 2009 at 12:49
Emeğe saygı gösterenlere saygı duyuyorum :))
Nisan 21st, 2009 at 00:42
merhaba hocam. öncelikle python konusunda türkçe bir site açmanız çok güzel. problemi elimden geldiğince biraz açıklamak isterim.
oluşturduğunuz movie nesnesi de aynı diğer label, button, centralwidget vs. gibi. bir farkı yok. QMovie de aynı slider, checkbox gibi bir widget yani. hepsini QtGui’den türetiyorsunuz. hepsi Ui_MainWindow’un. onun için başına bir self. koyarak ifade etmeniz lazım.
Nisan 21st, 2009 at 22:51
Merhaba,
Ui_MainWindow onject’ten türetilmiş bir sınıf, self’te dediğiniz gibi Ui_MainWindow’u gösteriyor. Label, CentralWidget self’e bağlanmak zorunda değil, local olarak tanımlanıp kullanılabilir. Label nesnesini oluştururken parent’ını belirtiyoruz zaten (label–>centralWidget, centralWidget–>MainWindow) ancak QMovie nesnesini oluştururken parent belirtmiyoruz, o yüzden nesnenin bir elemanı olarak tanımlanması gerekiyor olabilir. Ancak QMovie nesnesini label’a bağladığımız için, label’da centralWidget üzerinden MainWindow nesnesine bağlı olduğundan QMoive’nin de dolaylı olarak MainWindow’u parent olarak almasını beklemiştim. Ancak oluşturulan her QMovie nesnesi Label’a bağlanmak zorunda değil, dolayısıyla sahipsiz kalma durumu da var, bunu önlemek için böyle bir kullanım zorunluluğu getirdiklerini düşünüyorum sonuçtan yola çıkarak.