PyQt5 Kütüphanesindeki QSlider Sınıfı Hakkında

Merhaba…
Önceki açtığım konuyu sildim. Çünkü sorunumu çözmüş bulunmaktayım (arayüzü ve birazda mantığı değiştirerek).

Hemmen sorunuma geliyorum aşağıya bir gif koyucam
Wyvern 2022-01-22 22-04-25
Gördüğünüz gibi ses açma kapama konusunda ve müziği durdurup başlatma konusunda herhangi bir problemde yok.

Problem olarak gördüğüm kısım şurası, süre ilerlerken aynı zamanda başlat durdur butonunun altında bulunan slider. QTimer'e bağlı olmadan şarkının uzunluğuna bağlı olarak bu slider’i nasıl kendi kendine hareket ettirebilirim? (orada görünen dakika bilgisi tamamen çalan parçanın süresidir parçadan parçaya değişir) İstek doğrultusunda kodda paylaşabilirim. Bütün fikirlere açığım.

PyQt5 dışında kullandığım diğer kütüphaneler: mutagen, os, time, pygame(müzik çalmak durdurmak başlatmak vs…)
Teşekkür ederimm.

2 Beğeni

Merhabalar hocam.

pygame.mixer.music.get_pos() ile bahsini ettiğiniz şeyi yapabilirsiniz.
Fakat veri milisaniye cinsinden geleceğinden, QSlider’ın değerini de ona göre ayarlamalısınız.
Burada ise şöyle bir sorun ortaya çıkıyor,
set_pos() ile şarkıyı ileri/geri sardığınızda, get_pos() ile aldığınız veride herhangi bir değişiklik olmuyor.
(En azından bende olmadı).
Mesela şarkıyı set_pos() ile 10 saniye ileri sardığımda, get_pos() bana hala hiç ileri sarılmamış gibi veri vermeye devam ediyor.

Bu yüzden ben de time modülüyle birlikte threading modülünü kullanmak durumunda kaldım.

Sorununuza tam çözüm değil ama üzerinde çalışmak isteyenler için şöyle bir kod bırakayım,

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from mutagen.mp3 import MP3
from threading import Thread
from time import sleep
import fnmatch
import os
import pygame
import sys

pygame.init()


class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(QSize(800, 550))
        self.setWindowTitle("MP3 Player")
        self.show()

        self.not_released = False
        self.is_selected = 1

        self.SongList = QListWidget(self)
        self.SongList.setGeometry(QRect(50, 50, 700, 250))
        self.SongList.currentItemChanged.connect(self.new_song_selected)
        self.SongList.show()

        self.slider = QSlider(self)
        self.slider.setGeometry(QRect(50, 350, 700, 50))
        self.slider.setOrientation(Qt.Horizontal)
        self.slider.sliderPressed.connect(self.sliderPressed)
        self.slider.sliderReleased.connect(self.sliderReleased)
        self.slider.setMinimum(0)
        self.slider.setTickInterval(1)
        self.slider.show()

        self.list_songs()

    def set_value(self):
        while True:
            # Eğer Slider'a basılı tutulmuyorsa...
            if self.not_released is False:
                # Slider'ın değerini tickInterval kadar artıralım.
                new_value = self.slider.value() + self.slider.tickInterval()
                self.slider.setValue(new_value)
                
            # Eğer yeni şarkı seçilmişse durduralım.
            if self.is_selected == 1:
                self.is_selected = (self.is_selected + 1) % 2
                break

            # tickInterval kadar saniye gecikme koyalım.
            sleep(self.slider.tickInterval())

    def set_maximum_value(self, name):
        # Şarkının uzunluğunu, Slider'ın maximum değeri olarak ayarlayalım.
        audio = MP3(name)
        length = audio.info.length
        self.slider.setMaximum(length)

    def list_songs(self):
        # Mevcut dizinde bulunan 'mp3' formatlı dosyaları listeleyelim.
        pattern = "*.mp3"
        path = os.getcwd()
        items = []
        for root, dirs, files in os.walk(path):
            for name in files:
                if fnmatch.fnmatch(name, pattern):
                    QListWidgetItem(name, self.SongList)

    def new_song_selected(self, item):
        # Listeden yeni bir şarkı seçildiğinde onu oynatalım.
        # Ek olarak Slider'ın değerini 0'a eşitleyelim.
        self.is_selected = (self.is_selected + 1) % 2
        name = item.text()
        self.set_maximum_value(name)
        self.slider.setValue(0)
        pygame.mixer.music.load(name)
        pygame.mixer.music.play()

        Thread(target=self.set_value).start()

    def sliderPressed(self):
        self.not_released = True

    def sliderReleased(self):
        # slider bırakıldığında, mevcut pozisyona göre şarkıyı oynatalım.
        # Slider'dan alınan değer,
        value = self.slider.value()
        # Şarkının oynatılacağı pozisyon,
        pygame.mixer.music.set_pos(value)
        # Ahanda bu satır bize hala hiç sarılmamış gibi bilgi veriyor.
        print(pygame.mixer.music.get_pos() // 1000)
        self.not_released = False
        

app = QApplication(sys.argv)
main = Main()

app.exec_()

1 Beğeni

Merhaba, neden Qt’nin sunmus oldugu QMediaPlayer sinifini kullanmiyorsunuz? Eger pygame kullanmak zorunda degilseniz bence kesinlikle QMediaPlayer kullanmalisiniz bu is icin. Ben kullanmistim ve gayet de isimi gordu, hata aldiginiz kisimlarda yardimci olabilirim.

2 Beğeni

Hocam sarf ettiğiniz emek benim için altın değerinde. Gerçekten çok teşekkür ederim. Zahmet edip çok güzel bir örnek hazırlamışsınız.

1 Beğeni

Düşünceniz için teşekkür ederim. Ya zaten PyQt5’e çok hakim olamadığımdan büyük çoğunlukla yardımı ordan burdan yazılar okuyarak alıyorum. QMediaPlayer’in kullanıldığını gördüğüm bir projede birisi video oynatıcı yapmış hani onları da izliyorum bakıp okuyorum, genelde QFileDialog kullanıyorlar hani bazı programlarda olur save as der ve tıkladıktan sonra pencere açılır nereye kaydetmek istersiniz diye. İşte benim amacım bu pencereyi açıp şarkıyı seçmek değil. Ben bunu youtube apisi ile veya bir youtube videosu izletip(ki bu çoğunlukla müzik ) indirtmek. Yani Bahsettiğim gibi farklı bir pencere açıp, kullanıcının oradan şarkıyı seçmesi değilde youtube ile harmanlayarak (zaman içinde farklı işlemlerde eklenebilir tabiiki) amatör bir program yapmak. (Zaten amacım kendimi geliştirmek :slight_smile: )

Anladim, o halde oynatilan medyayi yonetme isini(oynat-duraklat, ileri-geri, ses azalt-yukselt vs.) YouTube’a yukleyelim. Pencere icerisinde bir web engine olusturalim ve girilen linkteki YouYube videosunu gosterelim. Video altinda da donusturulebilecek formatlari(video ise cozunurlukleri dahil) olsun. Secilen kriterleri goz onunde bulundurarak medyayi indirecegiz. Videoyu gosterme disindaki kisimlari youtube_dl kutuphanesi ile yapacagiz.

2 Beğeni

Teker teker uygulamaya çalışacağım not aldım. Çok teşekkür ederim :heart:

1 Beğeni

Rica ederim. Zor degil, yaparsiniz :slightly_smiling_face: