QMovie Sinyallerini Yakalayamiyorum

Merhabalar, bu platformda yeniyim. Burayi kesfettigimde oldukca sevindim, cunku diger forumlara gore biraz daha aktif gozukuyor :slight_smile:

Yasadigim problemden bahsedeyim, bir QMainWindow sinifim var. Icerisinde bir label ve bu label uzerinde de bir QMovie var. Ben hicbir sekilde bu QMovie nesnesinden yayilan sinyalleri yakalayamiyorum. Rica etsem bi’ bakar misiniz?

Kaynak dosya: Ubuntu Pastebin

Merhaba,

self.movie.started.connect(lambda: print('started'))
        self.movie.finished.connect(lambda: print('finished'))

Yerine

self.movie.started.connect(lambda e: print('started'))
        self.movie.finished.connect(lambda e: print('finished'))

Seklinde deneyebilir misiniz, bilgisayar başında olmadığım için test edemiyorum.

Maalesef, sonuc degismedi

Merhaba,

Kendi bilgisayarıma PySide2 kurmaya çalıştım ama ne yazık ki başaramadım. Ben de bunun üzerine sorunuzun cevabını PyQt5 kullanarak çözmeye çalıştım.

# name will be decided later
import sys
from PyQt5.QtGui import*
from PyQt5.QtCore import*
from PyQt5.QtWidgets import*
# from uiFile import Ui_MainWindow



class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        # self.ui = Ui_MainWindow()
        # self.ui.setupUi(self)
        self.resize(800, 600)

        self.userPhoto = QLabel(self)
        self.userPhoto.setGeometry(250, 250, 500, 100)

        self.movie = QMovie("femaleUser.gif")
        self.userPhoto.setMovie(self.movie)
        
        self.movie.started.connect(lambda: print('started'))
        self.movie.finished.connect(lambda: print('finished'))
        
        self.movie.start()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

Sorununuz şu, siz önce gif i oynatmaya başlamıssınız, daha sonra ise signal lere fonksiyon bağlamışsınız. Ama önce signaller bağlanmalı, daha sonra gif başlatılmalıydı.

Bu arada halledemediğim bir sorun var:

finished signali hala çalışmıyor, bu signali sadece self.movie.finished.emit() ile çalıştırabildim.

Yani özetle, sizin fonksiyon bağlamanızda sıkıntı yok, sıkıntı bağlama zamanının yanlış ayarlanması.

Eğer finished ile alakalı bir şey bulabilirsem buraya yazarım.

Hayırlı günler dilerim.

1 Beğeni

Tesekkur ederim vakit ayirdiginiz icin, belki de baska sekilde cozebiliriz. Sanirim direkt yapmak istedigim seyi anlatirsam istedigimiz seye daha hizli ulasacagiz.

Pencerenin ortasinda bir gif olacak, bu gif 10 saniyede 1 calismasi lazim. QMovie, bir kere start verilince durmuyor. Dogal olarak surekli oynatiyor gif’i. Bittigi anda yayilan sinyali yakalayabilirsem gif’i durduracaktim. QTimer ile de saniyeleri tutup sirasi geldiginde bir kere daha calistiracaktim. Belki de kurdugum mantik hatalidir

Hocam tekrar merhaba, şurada bir yöntemden bahsetmiş.

Bu yönteme göre

Pseudo:

def finish_gif():
    if (self.movie.currentFrameCount == self.movie.frameCount - 1):
        print("finished")

self.movie.frameChanged.connect(self.finish_gif)

gibi bir şey. Bana çok mantıklı geldi. Frame değiştiğinde o Frame in son Frame olup olmadığını kontrol etmek Ben maalesef yine deneyemiyorum ama bunu bir dener misiniz, deneyebildiğim zaman size geri dönüş yaparım.

1 Beğeni

Evet, gercekten harika :slightly_smiling_face:

Ise yaradi;

# name will be decided later
import sys
from PyQt5.QtGui import*
from PyQt5.QtCore import*
from PyQt5.QtWidgets import*
# from uiFile import Ui_MainWindow



class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        # self.ui = Ui_MainWindow()
        # self.ui.setupUi(self)
        self.resize(800, 600)

        self.userPhoto = QLabel(self)
        self.userPhoto.setGeometry(250, 250, 500, 100)

        self.movie = QMovie("icons/femaleUser.gif")
        self.userPhoto.setMovie(self.movie)
        self.movie.frameChanged.connect(self.control)
        self.movie.start()

    def control(self):
        if self.movie.currentFrameNumber() == self.movie.frameCount()-1:
            print("finished")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())
1 Beğeni

Iste bu da aradigimiz sonuc;

# name will be decided later
import sys
from PyQt5.QtGui import*
from PyQt5.QtCore import*
from PyQt5.QtWidgets import*
# from uiFile import Ui_MainWindow



class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        # self.ui = Ui_MainWindow()
        # self.ui.setupUi(self)
        self.resize(800, 600)

        self.userPhoto = QLabel(self)
        self.userPhoto.setGeometry(250, 250, 500, 100)

        self.movie = QMovie("icons/femaleUser.gif")
        self.userPhoto.setMovie(self.movie)
        self.movie.frameChanged.connect(self.is_movie_finished)
        self.movie.start()

        self.timer = QTimer()
        self.timer.start(3000)
        self.timer.timeout.connect(lambda: self.movie.start())

    def is_movie_finished(self):
        if self.movie.currentFrameNumber() == self.movie.frameCount()-1:
            self.movie.stop()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

Ornek bir Gif
femaleUser

@Cihat_Altiparmak cok tesekkur ederim :slight_smile:

1 Beğeni

Önemli değil kolay gelsin :upside_down_face: