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_()