PyQt5'te müzik çalar için şarkının resmini almak

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

import io
from PIL import Image
import stagger

class pencere(QWidget):
    def __init__(self):
        super().__init__()
        self.setUI()

    def setUI(self):
        self.label = QLabel(self)

        resim = self.resim_al()
        pixmap = QPixmap(resim)
        self.label.setPixmap(pixmap)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.label)


    def resim_al(self):
        sarki = "C:/Users/Asus/Desktop/mp3_müzikler/Zolf - Mohsen Namjoo _ Nederlands Blazers Ensemble.mp3"

        mp3 = stagger.read_tag(sarki)
        by_data = mp3[stagger.id3.APIC][0].data

        im = io.BytesIO(by_data)
        imageFile = Image.open(im)
        print(imageFile.format) # JPEG

        return imageFile


app = QApplication(sys.argv)
pencere = pencere()
pencere.show()
app.exec_()

Label’a şarkının resmini göndermeye çalışıyorum. Fakat şu hatayı veriyor. Hatanın neden kaynaklandığını da biliyorum.

 pixmap = QPixmap(resim)
TypeError: QPixmap(): argument 1 has unexpected type 'JpegImageFile'
JPEG

Aşağıdaki kodun çıktısı JPEG

print(imageFile.format) # JPEG

Normalde QPixmap jpeg türü dosyaları kabul ediyor ama neden burda hata aldım onu anlamadım.
Şimdiden teşekkürler.

Qpixmap(resim) type hatası veriyor.
Burada Kodlar bulunnuyor.

Buraya baktım fakat işime yaramadı

Kodun tam hata çıktısını atarmısınız ?

"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe" "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.2\plugins\python-ce\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 52994 --file "C:/Users/pl/Desktop/PYTHON/PyQt5 Dersleri/Müzik Çalar Projesi-2/çalışma5.py"
pydev debugger: process 10136 is connecting

Connected to pydev debugger (build 193.6911.25)
JPEG
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1434, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/pl/Desktop/PYTHON/PyQt5 Dersleri/Müzik Çalar Projesi-2/çalışma5.py", line 39, in <module>
    pencere = pencere()
  File "C:/Users/pl/Desktop/PYTHON/PyQt5 Dersleri/Müzik Çalar Projesi-2/çalışma5.py", line 12, in __init__
    self.setUI()
  File "C:/Users/pl/Desktop/PYTHON/PyQt5 Dersleri/Müzik Çalar Projesi-2/çalışma5.py", line 18, in setUI
    pixmap = QPixmap(resim)
TypeError: QPixmap(): argument 1 has unexpected type 'JpegImageFile'

resim_al() fonksiyonu doğru olsa bile muhtemelen resmi Jpeg biçiminde almıyor olabilir.

Normal bir jpeg dosyasını qpixmap’e atınca oldu ama

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

import io
import stagger

# PIL modülüne ihtiyaç yok

class pencere(QWidget):
    def __init__(self):
        super().__init__()
        self.setUI()

    def setUI(self):
        self.label = QLabel(self)

        resim = self.resim_al()
        mpixmap = QPixmap()
        mpixmap.loadFromData(resim, "JPEG") # veriyi yüklüyor
        self.label.setPixmap(mpixmap)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.label)

    def resim_al(self):
        sarki = "C:/Users/Asus/Desktop/mp3_müzikler/Zolf - Mohsen Namjoo _ Nederlands Blazers Ensemble.mp3"

        mp3 = stagger.read_tag(sarki)
        by_data = mp3[stagger.id3.APIC][0].data

        return by_data # byte olan veriyi döndürüyor


app = QApplication(sys.argv)
pencere = pencere()
pencere.show()
app.exec_()

Resmi direkt byte’dan görüntülemek için PIL modülü yerine QPixmap içerisinden loadFromData metodunu kullanmalısınız.

Çok teşekkür ederim kardeşim. Bu işimi görür

Bende bir şey sormak istiyorum belirli bir pathden alinan resmi belirli bir surface e sığdırarak ekrana bastırmak mumkunmu PyQt5 ye?

    def picture_changed(self):
        self.picture = Song_Picture(self.song_path).picture()
        if self.picture:
            pixmap = QPixmap()
            pixmap.loadFromData(self.picture,"jpeg")
            pixmap.scaled(64,64)
            self.song_picture.setPixmap(pixmap)
        else:
            self.song_picture.setPixmap(QPixmap("C:/Users/Asus/Desktop/music.jpg"))

self.song_picture’un ayarları da şu:

        self.song_picture = QLabel(self)
        self.song_picture.setFixedSize(QSize(350, 350))
        self.song_picture.setScaledContents(True)

Yani label’in boyutunu sınırladım ve Qpixmap’i de ölçeklendirince oldu.Sorunuzun cevabı oldu mu tam emin değilim :slight_smile:

1 Beğeni