Aplikasi Pemutar Musik PySide versi 10

BelajarPython - Assalamualaikum wr. wb.

Jumpa lagi temen - temen... Kali ini, Saya akan mengajak kalian untuk membuat musik player nih.. Dengan tampilan yang cukup apik dan keren.. Penasaran ? Langsung saja yuk kita simak sama - sama...

Pengenalan aplikasi yang akan kita buat.

Sebenarnya, saya sudah membuat aplikasi serupa menggunakan library Pygame dan Tkinter.. jadi, tampilannya terlihat jadul (KLIK DISINI untuk cari tau).. Tapi kali ini, tampilannya cukup keren untuk digunakan sebagai pemutar musik harian loh...

Namun, Aplikasi ini saya posting dengan berbagai versi (untuk memudahkan proses belajar).. Dengan penambahan fitur di tiap versinya.. Jika kalian ingin melihat versi - versi aplikasi ini, KALIAN BISA KLIK DISINI ya..

Pada postingan kali ini saya akan memberikan code pemutar musik versi 10. Dimana pada versi kali ini saya akan mematikan tombol yang tidak berfungsi pada kondisi tertentu. Dan menghidupkannya kembali ketika tombol tersebut sudah berfungsi.  Misalnya, tombol stop akan mati ketika musik tidak sedang di putar. Untuk lebih jelasnya langsung di coba saja code program nya ya..

Rincian Lengkap Aplikasi Pemutar Musik PySide Versi 10.0

Aplikasi kali ini menggunakan library PySide. Jadi, untuk menjalankannya, harus menginstallnya dulu... KLIK DISINI untuk install pyside.... Dan berikut rincian lengkap aplikasinya...

Nama: mn-mp3SidePlayer 10.0
Versi: 10.0 | klik disini untuk membaca versi selanjutnya.
Platform: Python 3.x
Modul: PySide. Klik disini untuk menginstallnya.
Baris Code: kurang lebih 325 baris code program.
Terdiri dari: 1 class dan 27 metode.
Fitur: Mematikan tombol yang tidak di perlukan, dan menghidupkan nya saat di perlukan.
Kelemahan: -
syarat menjalankan: install python 3.x dan PySIde, punya editor teks atau IDE.
Cara menjalankan: install python 3 dan PySide, copy dan paste code program pada editor atau IDE, simpan dalam file python(ekstensi .py), lalu jalankan.

Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Code program aplikasi Pemutar Musik PySide versi 10.0

Nah lalu seperti apa code program dari aplikasi Pemutar Musik PySide ini ? Oke, Berikut saya berikan code program nya ya...


from PySide import QtGui, QtCore
from PySide.phonon import Phonon
import sys, os

class PemutarMusik(QtGui.QMainWindow) :
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.penampungFile = []
        self.sedangDiputar = False
        self.indeks = 0
        self.indeksTadi=-1
        self.volumeYgLalu = 0.5

        self.inisialisasiMedia()
        self.buatTabel()
        self.buatTombol()
        self.buatSlider()
        self.buatTeks()
        self.layout()
        self.susunSlider()
        self.susunTombol()
        self.rangkai()

        self.connect(self.pemutar, QtCore.SIGNAL('stateChanged(Phonon::State, Phonon::State)'), self.statusBerubah)
        self.connect(self.pemutar, QtCore.SIGNAL('finished()'), self.putarMusik)

    def inisialisasiMedia(self):
        self.suara = Phonon.AudioOutput(Phonon.MusicCategory, self)
        self.pemutar = Phonon.MediaObject(self)

        Phonon.createPath(self.pemutar, self.suara)

    def buatTabel(self):
        title = ['Judul', 'Ukuran' ,'Lokasi']
        data = self.penampungFile

        # besarnya kolom
        colcnt = len(title)
        rowcnt = len(data)

        self.tabel = QtGui.QTableWidget(rowcnt, colcnt)

        self.connect(self.tabel, QtCore.SIGNAL('cellDoubleClicked(int, int)'), self.klikTabel)
        self.connect(self.tabel, QtCore.SIGNAL('cellPressed(int, int)'), self.klik)
        # self.connect(self.tabel, QtCore.SIGNAL('currentCellChanged(int, int, int, int)'), self.pilihanBerubah)

        # judul vertikal
        vheader = QtGui.QHeaderView(QtCore.Qt.Orientation.Vertical)
        vheader.setResizeMode(QtGui.QHeaderView.ResizeToContents)
        self.tabel.setVerticalHeader(vheader)

        # judul horizontal
        hheader = QtGui.QHeaderView(QtCore.Qt.Orientation.Horizontal)
        hheader.setResizeMode(QtGui.QHeaderView.ResizeToContents)
        self.tabel.setHorizontalHeader(hheader)
        self.tabel.setHorizontalHeaderLabels(title)

        self.updateTabel()

    def buatTombol(self):
        self.tombolStopPlay = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaPlay), "Play/Pause",  self, triggered=self.putarAtauPause)
        self.tombolNext = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSkipForward), "Lagu selanjutnya",  self, triggered = self.perintahNext)
        self.tombolPrevious = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSkipBackward), "Lagu Sebelumnya",  self, triggered = self.perintahPrevious)
        self.tombolMaju = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSeekForward), "Maju 5 Detik",  self, triggered=self.perintahMaju)
        self.tombolMundur = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSeekBackward), "Mundur 5 Detik",  self, triggered=self.perintahMundur)
        self.tombolStop = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaStop), "Stop Musik",  self, triggered=self.perintahStop)
        self.tombolBukaFile = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_FileIcon), "Cari file mp3", self, triggered=self.dataDariFile)
        self.tombolHapus = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_DialogDiscardButton), "Hapus Musik", self, triggered=self.perintahHapus)

        self.tombolWeb = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_ComputerIcon), "Pergi Ke Web", self, triggered=self.perintahWeb)

    def buatSlider(self):
        self.posisi = Phonon.SeekSlider(self)
        self.volume = Phonon.VolumeSlider(self)

        self.volume.setAudioOutput(self.suara)
        self.posisi.setMediaObject(self.pemutar)

    def perintahWeb(self):
        QtGui.QDesktopServices.openUrl(QtCore.QUrl('Http://mn-belajarpython.blogspot.co.id'))

    def closeEvent(self, event):
        self.destroy()

    def buatTeks(self):
        self.indikator = QtGui.QLabel(''' mn-belajarpython.blogspot.co.id ''')

    def layout(self):
        widgetTengah = QtGui.QWidget()
        self.layoutUtama = QtGui.QVBoxLayout(widgetTengah)
        self.layoutTombol = QtGui.QToolBar()
        self.layoutSlider = QtGui.QGridLayout()

        self.layoutTombol.setMovable(False)
        self.layoutUtama.setSpacing(0)
        self.setCentralWidget(widgetTengah)

    def susunTombol(self):
        self.layoutTombol.addAction(self.tombolStopPlay)
        self.layoutTombol.addAction(self.tombolPrevious)
        self.layoutTombol.addAction(self.tombolMundur)
        self.layoutTombol.addAction(self.tombolStop)
        self.layoutTombol.addAction(self.tombolMaju)
        self.layoutTombol.addAction(self.tombolNext)
        self.layoutTombol.addSeparator()
        self.layoutTombol.addAction(self.tombolBukaFile)
        self.layoutTombol.addAction(self.tombolWeb)
        self.layoutTombol.addAction(self.tombolHapus)
        self.layoutTombol.addSeparator()
        self.layoutTombol.addWidget(QtGui.QLabel('   '))
        self.layoutTombol.addWidget(self.indikator)

        self.tombolMundur.setEnabled(False)
        self.tombolMaju.setEnabled(False)
        self.tombolStop.setEnabled(False)
        self.tombolNext.setEnabled(False)
        self.tombolPrevious.setEnabled(False)
        self.tombolHapus.setEnabled(False)

    def susunSlider(self):
        self.layoutSlider.setColumnStretch(0,1)
        self.layoutSlider.addWidget(self.posisi,0,0)
        self.layoutSlider.addWidget(self.volume,0,1)

    def rangkai(self):
        self.layoutUtama.addWidget(self.tabel)
        self.layoutUtama.addLayout(self.layoutSlider)

        self.addToolBar( QtCore.Qt.BottomToolBarArea ,self.layoutTombol)

    def updateTabel(self):
        for i in range(self.tabel.rowCount()):
            self.tabel.removeRow(0)
        for i in range(len(self.penampungFile)):
            self.tabel.insertRow(i)
            namaFile = os.path.basename(self.penampungFile[i][0])
            lokasi = str(self.penampungFile[i][1])
            ukuran = QtCore.QFileInfo(self.penampungFile[i][0]).size()

            namaFile = QtGui.QTableWidgetItem(namaFile)
            ukuran = QtGui.QTableWidgetItem(str(ukuran//1000)+" KB")
            durasi = QtGui.QTableWidgetItem(str(lokasi))

            namaFile.setFlags(namaFile.flags() ^ QtCore.Qt.ItemIsEditable)
            ukuran.setFlags(ukuran.flags() ^ QtCore.Qt.ItemIsEditable)
            durasi.setFlags(durasi.flags() ^ QtCore.Qt.ItemIsEditable)

            self.tabel.setItem(i,0,namaFile)
            self.tabel.setItem(i, 1, ukuran)
            self.tabel.setItem(i,2,durasi)

    def perintahHapus(self):
        terpilih = self.tabel.selectedIndexes()
        if terpilih :
            reply = QtGui.QMessageBox.question(self, 'Konfimasi',
                                                   "apakah anda ingi menghapus item yang terpilih dari daftar putar?", QtGui.QMessageBox.Yes |
                                                   QtGui.QMessageBox.No, QtGui.QMessageBox.No)
            baris=[]
            for i in terpilih :
                if i.row() not in baris :
                    baris.append(i.row())

            for i in baris:
                data = self.tabel.item(i, 0).text()
                if reply == QtGui.QMessageBox.Yes:
                    cocok = False
                    for j in range(len(self.penampungFile)):
                        if os.path.basename(self.penampungFile[j][0]) == data:
                            cocok = True
                            break
                    if cocok:
                        nama = self.penampungFile.pop(j)[0]
                        if self.pemutar.currentSource().fileName() == nama :
                            if self.indeks:
                                self.indeks -=1
                            if self.sedangDiputar :
                                self.putarMusik()
                            else:
                                self.putarMusik()
                                self.perintahStop()
            self.updateTabel()

            if len(self.penampungFile) <= 1 :
                self.tombolNext.setEnabled(False)
                self.tombolPrevious.setEnabled(False)
        else:

            messagebox = QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Gagal Menghapus", "Silahkan pilih satu atau beberpa file pada tabel\n"
                                                  "untuk menghapusnya dari daftar putar.",
                                          buttons=QtGui.QMessageBox.Ok,
                                          parent=self)
            messagebox.setDefaultButton(QtGui.QMessageBox.Cancel)
            exe = messagebox.exec_()

    def dataDariFile(self):
        dialog = QtGui.QFileDialog(self)                        # memanggil objekFileDialog
        dialog.setFileMode(QtGui.QFileDialog.ExistingFiles)      # memanggil objek dengan semua tipe file
        dialog.setFilters(["*.mp3", "*.*"])
        if dialog.exec_() == QtGui.QDialog.Accepted:
            path = dialog.selectedFiles()
            for i in path :
                lokasi=QtCore.QFileInfo(i).absolutePath()
                tipe=QtCore.QFileInfo(i).suffix()
                if tipe.lower() == 'mp3' :
                    self.masukanFile([i,lokasi])
            if self.sedangDiputar == False:
                self.putarMusik()

    def putarAtauPause(self):
        if self.penampungFile :
            if self.sedangDiputar :
                self.pemutar.pause()
                self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPlay))
            else :
                self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPause))
                self.pemutar.play()

        else:
            self.dataDariFile()

    def masukanFile(self, data):
        if data not in self.penampungFile :
            self.penampungFile.append(data)

        if len(self.penampungFile) > 1 :
            self.tombolNext.setEnabled(True)
            self.tombolPrevious.setEnabled(True)
        self.updateTabel()

    def dapatkanData(self):
        if len(self.penampungFile) :
            if self.indeks < len(self.penampungFile)  :
                self.indeks += 1
                return self.penampungFile[self.indeks-1][0]
            else :
                self.indeks = 0
                return self.penampungFile[self.indeks][0]
        else:
            return None

    def klik(self, baris, kolom):
        self.tabel.selectRow(baris)
        self.tombolHapus.setEnabled(True)

    # def pilihanBerubah(self, baris, kolom, a, b):
    #     self.tabel.selectRow(baris)
    #     print('baris : ', baris)

    def klikTabel(self, baris, kolom):
        self.tabel.selectRow(baris)
        # if self.radio1.isChecked() :
        data = self.tabel.item(baris, 0).text()
        for i in range(len(self.penampungFile)) :
            if os.path.basename(self.penampungFile[i][0]) == data :
                self.indeks=i
                self.putarMusik()

    def putarMusik(self):
        data = self.dapatkanData()
        if data :
            self.pemutar.setCurrentSource(data)
            self.pemutar.play()
            self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPause))
        else:
            self.perintahStop()

    def perintahStop(self):
        self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPlay))
        self.pemutar.stop()

    def perintahMundur(self):
        waktuPutar = self.pemutar.currentTime()
        if waktuPutar > 5000 :
            self.pemutar.seek(waktuPutar-5000)

    def perintahMaju(self):
        waktuPutar = self.pemutar.currentTime()
        total = self.pemutar.totalTime()
        if total-5000>waktuPutar :
            self.pemutar.seek(waktuPutar+5000)

    def perintahNext(self):
        self.putarMusik()

    def perintahPrevious(self):
        if self.indeks == 1 :
            self.indeks = len(self.penampungFile)-1
        else:
            self.indeks -= 2
        self.putarMusik()


    def statusBerubah(self, statusBaru, oldState):
        if statusBaru == Phonon.ErrorState:
            if self.mediaObject.errorType() == Phonon.FatalError:
                QtGui.QMessageBox.warning(self, self.tr("Fatal Error"), self.mediaObject.errorString())
            else:
                QtGui.QMessageBox.warning(self, self.tr("Error"), self.mediaObject.errorString())

        elif statusBaru == Phonon.PlayingState:
            self.sedangDiputar = True

            self.tombolMundur.setEnabled(True)
            self.tombolMaju.setEnabled(True)
            self.tombolStop.setEnabled(True)

        elif statusBaru == Phonon.StoppedState:
            self.sedangDiputar = False

            self.tombolMundur.setEnabled(False)
            self.tombolMaju.setEnabled(False)
            self.tombolStop.setEnabled(False)

        elif statusBaru == Phonon.PausedState:
            self.sedangDiputar = False

            self.tombolMundur.setEnabled(True)
            self.tombolMaju.setEnabled(True)
            self.tombolStop.setEnabled(False)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = PemutarMusik()
    window.setWindowTitle("Musik Player -> mn-belajarpython.blogspot.co.id")
    window.show()
    sys.exit(app.exec_())


Nah lalu, seperti apakah tampilan yang akan di hasilkan dari code program di atas? Langsung saja yuk kita simak sama - sama tampilannya di bawah ini...



Penjelasan code program Aplikasi Pemutar musik PySide versi 10.0

Sekarang saya akan mencoba untuk menjelaskan code program yang sudah saya bagikan di atas tadi.. Agar kalian lebih mudah untuk memahaminya.. Oke, Langsung saja yuk kita simak sama penjelasannya di bawah ini....

[NOTE : Teks berwarna MERAH pada penjelasan adalah Code tambahan yang tidak ada di versi sebelumnyaDan yang Berwarna BIRU akan di hapus di versi berikutnya. Jika Code berwarna MERAH dan komentar berwarna BIRU maka merupakan code baru dan akan di hapus di versi berikutnya]

from PySide import QtGui, QtCore  //mengimport class ‘QtGui’ dan ‘QtCore’ dari PySide
from PySide.phonon import Phonon  //mengimport class ‘PySide’ dari PySide
import sys, os  //mengimport sys dan os dari python

class PemutarMusik(QtGui.QMainWindow) :  //membuat class ‘PemutarMusik’ dengan meng inheritence class ‘QMainWindow’
    def __init__(self):  //construktor class ‘PemutarMusik’
        QtGui.QMainWindow.__init__(self)  //memanggil construktor class ‘QMainnWindow’ dengan memasukkan “self (class ‘PemutarMusik’)” sebagai parameter

        self.penampungFile = []  //digunakan untuk menampung lokasi musik
        self.sedangDiputar = False  //variabel untuk menentukan apakah musik sedang di putar. (False=berhenti dan True=sedang diputar) 
        self.indeks = 0  //digunakan untuk menentukan urutan musik yang diputar
        self.indeksTadi=-1  //dihunakan untuk menyimpan posisi musik yang di putar sebelumnya
        self.volumeYgLalu = 0.5  //digunakan untukmenyimpan volume sebelumnya

        self.inisialisasiMedia()  //memanggil metode ‘inisialisasiMedia’
        self.buatTabel()  //memanggil metode dengan nama ‘buatTabel’
        self.buatTombol()  //memanggil metode ‘buatTombol’
        self.buatSlider()  //memanggil metode ‘buatSlider’
        self.buatTeks()  //memanggil metode ‘buatTeks’
        self.layout()  //memanggil metode ‘layout’
        self.susunSlider()  //memanggil metode ‘susunSlider’
        self.susunTombol()  //memanggil metode ‘susunTombol’
        self.rangkai()  //memanggil metode ‘rangkai’

        self.connect(self.pemutar, QtCore.SIGNAL('stateChanged(Phonon::State, Phonon::State)'), self.statusBerubah)   //digunakan untuk menjalankan metode ‘statusBerubah’ ketika memutar musik. Dan akan selalu di jalankan selama memutar musik
        self.connect(self.pemutar, QtCore.SIGNAL('finished()'), self.putarMusik)  //untuk menjalankan  metode ‘putarMusik’ ketika memutar sebuah musik telah selesai

    def inisialisasiMedia(self):  //membuat metode ‘insialisasiMedia’
        self.suara = Phonon.AudioOutput(Phonon.MusicCategory, self)  //mendefinisikan suara pemutar musik
        self.pemutar = Phonon.MediaObject(self)  //membuat pemutar lagu

        Phonon.createPath(self.pemutar, self.suara)  //menghubungkan pemutar dengan audio

    def buatTabel(self):  //metode untuk membuat tabel
        title = ['Judul', 'Ukuran' ,'Lokasi']  //judul tabel
        data = self.penampungFile  //mengambil data (file musik)

        # besarnya kolom
        colcnt = len(title)  //menghitung jumlah judul
        rowcnt = len(data)  //menghitung jumlah data (file musik)

        self.tabel = QtGui.QTableWidget(rowcnt, colcnt)  //membuat tabel dengan jumlah kolom sesuai jumlah judul dan baris sesuai banyak data. Di variabel ‘rowcnt’ ->jumlah baris dan ‘colcnt’->jumlah kolom

        self.connect(self.tabel, QtCore.SIGNAL('cellDoubleClicked(int, int)'), self.klikTabel)  //untuk menjalankan metode ‘klikTabel’ ketika user klik 2x pada daftar putar musik yang ada di tabel
        self.connect(self.tabel, QtCore.SIGNAL('cellPressed(int, int)'), self.klik)  //digunakan untuk menjalankan metode ‘klik’ ketika salah satu cell tabel di klik

        # judul vertikal
        vheader = QtGui.QHeaderView(QtCore.Qt.Orientation.Vertical)  //mengatur judul.
        vheader.setResizeMode(QtGui.QHeaderView.ResizeToContents)  //agar lebar cell content mengikuti judul
        self.tabel.setVerticalHeader(vheader)  //mengatur agar header di kiri

        # judul horizontal
        hheader = QtGui.QHeaderView(QtCore.Qt.Orientation.Horizontal)  //insialisasi horizontal header (diatasi)
        hheader.setResizeMode(QtGui.QHeaderView.ResizeToContents)  //mengubah ukuran konter agar sesuai dengan judul di atas
        self.tabel.setHorizontalHeader(hheader)  //mengatur horizontol header
        self.tabel.setHorizontalHeaderLabels(title)  //memasukkan judul yang ada di variabel ‘title’

        self.updateTabel()  //memanggil metode ‘updateTabel’

    def buatTombol(self):  //membuat metode ‘buatTombol’
        self.tombolStopPlay = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaPlay), "Play/Pause",  self, triggered=self.putarAtauPause)  //membuat perintah ‘play/pause’ yang akan menjalankan metode ‘putarAtauPause’ ketika di klik.
        self.tombolNext = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSkipForward), "Lagu selanjutnya",  self, triggered = self.perintahNext)  //membuat perintah ‘Lagu Selanjutnya’ yang akan menjalankan metode ‘perintahNext’ ketika di klik.
        self.tombolPrevious = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSkipBackward), "Lagu Sebelumnya",  self, triggered = self.perintahPrevious)  //membuat perintah ‘Lagu Sebelumnya’ yang akan menjalankan metode ‘perintahPrevious’ ketika di klik.
        self.tombolMaju = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSeekForward), "Maju 5 Detik",  self, triggered=self.perintahMaju)    //membuat perintah ‘Maju 5 Detik’ yang akan menjalankan metode ‘tombolMaju’ ketika di klik
        self.tombolMundur = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaSeekBackward), "Mundur 5 Detik",  self, triggered=self.perintahMundur)  //membuat perintah ‘Mundur 5 Detik’ yang akan menjalankan metode ‘tombolMaju’ ketika di klik
        self.tombolStop = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_MediaStop), "Stop Musik",  self, triggered=self.perintahStop)  //membuat perintah ‘stop’ yang akan menjalankan metode ‘perintahStop’ ketika di klik.
        self.tombolBukaFile = 
QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_FileIcon), "Cari file mp3", self, triggered=self.dataDariFile)  //digunakan untuk membuat perintah ‘cari file mp3’ yang akan menjalankan metode ‘dataDariFile’ ketika di klik.
        self.tombolHapus = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_DialogDiscardButton), "Hapus Musik", self, triggered=self.perintahHapus)  //digunakan untuk membuat perintah ‘Hapus Musik’ yang akan menjalankan metode ‘perintahHapus’ ketika di klik.

        self.tombolWeb = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_ComputerIcon), "Pergi Ke Web", self, triggered=self.perintahWeb)  //membuat action ‘Pergi Ke Web’ denga menjalankan metode ‘perintahWeb’ ketika di klik

    def buatSlider(self):  //membuat metode ‘buatSlider’
        self.posisi = Phonon.SeekSlider(self)  //insialisasi slider progress musik
        self.volume = Phonon.VolumeSlider(self)  //nisialisasi slider volume

        self.volume.setAudioOutput(self.suara)  //menyambungkan audio ke slider volume
        self.posisi.setMediaObject(self.pemutar)  //menghubungkan slider ke pemutar musik

    def perintahWeb(self):  //metode ‘perintahWeb’
        QtGui.QDesktopServices.openUrl(QtCore.QUrl('Http://mn-belajarpython.blogspot.co.id'))  //membuka browser dan pergi ke blog ini :)

    def closeEvent(self, event):  //metode yg otomatis di jalankan ketika window di close. ‘built in PySide’
        self.destroy()  //menghentikan aplikasi

    def buatTeks(self):  //metode buatTeks
        self.indikator = QtGui.QLabel('''<b> mn-belajarpython.blogspot.co.id </b>''')  //membuat Teks dan disimpan ke ‘indikator’

    def layout(self):  //metode layout
        widgetTengah = QtGui.QWidget()  //membuat widget
        self.layoutUtama = QtGui.QVBoxLayout(widgetTengah)  //membuat layout utama
        self.layoutTombol = QtGui.QToolBar()  //membuat tempat tombol
        self.layoutSlider = QtGui.QGridLayout()  //inisialisasi tempat (layout) slider musik

        self.layoutTombol.setMovable(False)  //membuat ‘layoutTombol’ agar tidak bisa di pindah
        self.layoutUtama.setSpacing(0)  //membuat komponen lebih rapat
        self.setCentralWidget(widgetTengah)  //memasukkan widget (layoutUtama) ke window

    def susunTombol(self):  //metode ‘susunTombol’
        self.layoutTombol.addAction(self.tombolStopPlay)  //memasukkan perintah/tombol “stopAtauPlay” ke window di ‘layoutTombol’
        self.layoutTombol.addAction(self.tombolPrevious)  //measukkan perintah yang ada di ‘tombolPrevious’ ke dalam ‘layoutTombol’
        self.layoutTombol.addAction(self.tombolMundur)  //memasukkan perintah/tombol “Mundur 5 detik” ke window di ‘layoutTombol’
        self.layoutTombol.addAction(self.tombolStop)  //memasukkan perintah/tombol “tombolStop” ke window di ‘layoutTombol’
        self.layoutTombol.addAction(self.tombolMaju)  //memasukkan perintah/tombol “Maju 5 detik” ke window di ‘layoutTombol’
        self.layoutTombol.addAction(self.tombolNext)  //measukkan perintah yang ada di ‘tombolNext’ ke dalam ‘layoutTombol’
        self.layoutTombol.addSeparator() //memberikan garis pembatas
        self.layoutTombol.addAction(self.tombolBukaFile)  //memasukkan ‘action’/perintah ‘Cari file mp3’ ke tempat tombol (layoutTombol)
        self.layoutTombol.addAction(self.tombolWeb)  //memasukkan ‘action’/perintah ‘pergi ke web’ ke tempat tombol (layoutTombol)
        self.layoutTombol.addAction(self.tombolHapus)  //memasukkan ‘action’/perintah ‘Hapus Musik’ ke tempat tombol (layoutTombol)
        self.layoutTombol.addSeparator()  //memberi garis batas
        self.layoutTombol.addWidget(QtGui.QLabel("  "))  //memasukkan spasi ke tempat tombol agar ada jarak
        self.layoutTombol.addWidget(self.indikator)  //memasukkan teks yang ada di ‘indikator’

  //tombol di bawah di matikan karena saat di jalankan, pemutar musik sedang tidak ada file musik di dalam nya

        self.tombolMundur.setEnabled(False)  //mematikan tombol ‘Mundur’
        self.tombolMaju.setEnabled(False)  //mematikan tombol ‘Maju’
        self.tombolStop.setEnabled(False)  //mematikan tombol ‘Stop’
        self.tombolNext.setEnabled(False)  //mematikan tombol ‘Next’
        self.tombolPrevious.setEnabled(False)  //mematikan tombol ‘Previous’
        self.tombolHapus.setEnabled(False)  //mematikan tombol ‘Hapus’

    def susunSlider(self):  //membuat metode susun slider
        self.layoutSlider.setColumnStretch(0,1)  //menentukan lokasi yang akan di perbesar/perkecil ketika di resize
        self.layoutSlider.addWidget(self.posisi,0,0)  //memasukkan slider progress pemutar musik ke layout slider.
        self.layoutSlider.addWidget(self.volume,0,1)    //memasukkan slider volume pemutar musik ke layout slider.

    def rangkai(self):  //metode ‘rangkai’
        self.layoutUtama.addWidget(self.tabel)  //memasukkan tabel ke dalam window
        self.layoutUtama.addLayout(self.layoutSlider)  //memasukkan layout slider musik ke window
        self.addToolBar( QtCore.Qt.BottomToolBarArea ,self.layoutTombol) //memasukkan tempat tombol (layoutTombol) ke dalam window

    def updateTabel(self):  //membuat metode
        for i in range(self.tabel.rowCount()):  //melakukan perulangan sebanyak baris di tabel
            self.tabel.removeRow(0)  //menghapus semua baris tabel
        for i in range(len(self.penampungFile)):  //melakukan perulangan sebanyak item di variabel ‘penampungFile’ (file musiknya)
            self.tabel.insertRow(i)  //membuat baris baru di tabel sebanyak item di ‘penampungFile’ (file musik)
            namaFile = os.path.basename(self.penampungFile[i][0])  //mendapatkan nama file musik tiap item yang tersimpan di ‘penampungFile’
            lokasi = str(self.penampungFile[i][1])  //mendapatkan lokasi file musik
            ukuran = QtCore.QFileInfo(self.penampungFile[i][0]).size()  //mendapatkan ukuran file musik

            namaFile = QtGui.QTableWidgetItem(namaFile)  //memasukkan namaFIle ke dalam satuan cell tabel pyside
            ukuran = QtGui.QTableWidgetItem(str(ukuran//1000)+" KB")  //memasukkan ukuran file musik ke dalam satuan cell tabel pyside
            durasi = QtGui.QTableWidgetItem(str(lokasi))  ////memasukkan durasi file musik ke dalam satuan cell tabel pyside

            namaFile.setFlags(namaFile.flags() ^ QtCore.Qt.ItemIsEditable)  //agar cell nama file musik tidak bisa di edit
            ukuran.setFlags(ukuran.flags() ^ QtCore.Qt.ItemIsEditable)  //agar cell ukuran file musik tidak bisa di edit
            durasi.setFlags(durasi.flags() ^ QtCore.Qt.ItemIsEditable)  //agar cell durasi file musik tidak bisa di edit

            self.tabel.setItem(i,0,namaFile)  //memasukkan cell nama file ke dalam tabel
            self.tabel.setItem(i, 1, ukuran)  //memasukkan cell ukuran file ke dalam tabel
            self.tabel.setItem(i,2,durasi)  //memasukkan cell durasi file ke dalam tabel

    def perintahHapus(self):  //membuat metode ‘perintahHapus’
        terpilih = self.tabel.selectedIndexes()  //digunakan untuk mengambil file musik yang terpilih di tabel
        if terpilih :  //memastikan file musik ada yang terpilih/memastikan variabel terpilih tidak kosong
            reply = QtGui.QMessageBox.question(self, 'Konfimasi',
                                                   "apakah anda ingi menghapus item yang terpilih dari daftar putar?", QtGui.QMessageBox.Yes |
                                                   QtGui.QMessageBox.No, QtGui.QMessageBox.No)

  //code di atas digunakan untuk meminta persetujuan user apakah bener-bener ingin di hapus

            baris=[]  //mendefinisikan variabel ‘baris’ 
            for i in terpilih :  //melakukan perulangan sebanyak file musik yang terpilih
                if i.row() not in baris :  //item yang terpilih tida ada di variabel ‘baris’
                    baris.append(i.row())  //digunakan untukmemasukkan baris yang terpilih ke dalam variabel ‘bari’ untuk di hapus

            for i in baris:  //melakukan perulangan sebanya item di variabel ‘baris’
                data = self.tabel.item(i, 0).text()  //mendapatkan teks nama yang akan di hapus yang terletak di tabel pada kolom ‘0’ atau kolom pertama 
                if reply == QtGui.QMessageBox.Yes:  //memastikan user setuju
                    cocok = False  //mendefinisikan variabel ‘cocok’
                    for j in range(len(self.penampungFile)):  //melakukan perulangan sebanyak file musik yang ada di ‘penampungFIle’
                        if os.path.basename(self.penampungFile[j][0]) == data:  //mengecek apakah file yang akan di hapus ada di ‘penampungFile’
                            cocok = True  //mengubah nilai ‘cocok’ menjadi ‘True’ jika ada file yang akan di hapus di temukan
                            Break  //menghentikan perulangan jika file yang akan di hapus ditemukann
                    if cocok:  //memastikan variabel ‘cocok’ adalah ‘True’ (file yang akan di hapus ditemukan)
                        nama = self.penampungFile.pop(j)[0]  //membuang file yang di temukan tersebut
                        if self.pemutar.currentSource().fileName() == nama :  //mengecek apakah file yang di hapus adalah file yang sedang diputar
                            if self.indeks:  //memastikan indeks tidak 0
                                self.indeks -=1  //mengurangi nilai indeks sebanyak 1
                            if self.sedangDiputar :  //mengecek apakah pemutar musik sedang memutar musik
                                self.putarMusik()  //menjalankan metode ‘putarMusik’ agar memutar lagu selanjutnya
                            else:  //jika pemutar musik tidak sedang memutar musik
                                self.putarMusik()  //menjalankan metode ‘putarMusik’ agar memutar lagu selanjutnya
                                self.perintahStop()  //menghentikan musik kembali
            self.updateTabel()  //menjalankan metode ‘updateTabel’ agar file musik yang di hapus tidak di tampilkan lagi

            if len(self.penampungFile) <= 1 :  //memastikan file musik yang ada di pemutar musik adalah 1 musik saja atau kosong
                self.tombolNext.setEnabled(False)  //mematikan tombol ‘Next’
                self.tombolPrevious.setEnabled(False)  //mematikan tombol ‘Previous’

        else:  //jika user tidak memilih user untuk dihapus tapi meng klik tombol hapus
            messagebox = QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Gagal Menghapus", "Silahkan pilih satu atau beberpa file pada tabel\n"
                                                  "untuk menghapusnya dari daftar putar.",
                                          buttons=QtGui.QMessageBox.Ok,
                                          parent=self)
            messagebox.setDefaultButton(QtGui.QMessageBox.Cancel)
            exe = messagebox.exec_()  
//code di atas digunakan untuk menampilkan pesan untuk memberi instruksi kepada user agar memilih musik yang akan di hapus


    def dataDariFile(self):  //metode ‘dataDariFile’ untuk membuka file musik
        dialog = QtGui.QFileDialog(self)  //membuat file dialog
        dialog.setFileMode(QtGui.QFileDialog.ExistingFiles)  //untuk membuat bisa memilih file musik lebih dari 1
        dialog.setFilters(["*.mp3", "*.*"])  //menentukan ekstensi yang dapat di tampilkan di file dialog
        if dialog.exec_() == QtGui.QDialog.Accepted:  //menampilkan file dialog dan mengecek apakah user meng klik ‘ok’ dan bukan ‘cancel’
            path = dialog.selectedFiles()  //menampung lokasi file yang di pilih
            for i in path :  //mengambil satu persatu item (lokasi file musik)
                lokasi=QtCore.QFileInfo(i).absolutePath()  //dignakan untuk menampung lokasi
                tipe=QtCore.QFileInfo(i).suffix()  //untuk mengambil ekstensi file
                if tipe.lower() == 'mp3' :  //mengecek apakah ekstensi nya mp3
                    self.masukanFile([i,lokasi])  //memasukkan lokasi file musik jika ber ekstensi ‘mp3’
            if self.sedangDiputar == False:  //mengecek apakah musik sedang tidak di putar
                self.putarMusik()  //menjalankan metode ‘putarMusik’

    def putarAtauPause(self):  //metode ‘putarAtauPause’
        if self.penampungFile :  //memastikan item dalam ‘penampungFIle’ (file musik) tidak kosong
            if self.sedangDiputar :  //memastikan musik sedang di putar
                self.pemutar.pause()  //mem-pause musik/menjeda pemutaran musik
                self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPlay))  //mengubah icon perintah ‘tombolStopPlay’ menjadi “play”
            else :  //jika musik sedang tidak di putar
                self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPause))  //mengubah icon perintah ‘tombolStopPlay’ menjadi “pause”
                self.pemutar.play()  //memutar musik

        else:  //jika ‘penampungFile’ (file musik) dalam ke adaan kosong
            self.dataDariFile()  //menjalanka metode ‘dataDariFile’

    def masukanFile(self, data):  //metode ‘masukanFile’ dengan parameter ‘data’
        if data not in self.penampungFile :  //memastikan file musik yang akan di masukkan tidak ada di penampung file (file musik yang telah di tampung)
            self.penampungFile.append(data)  //memasukkan file musik. Jika kondisi di atasnya terpenuhi

        if len(self.penampungFile) > 1 :  //mengecek apakah file musik yang ada di pemutar ini lebih dari 1
            self.tombolNext.setEnabled(True)  //menghidupkan tombol ‘Next’
            self.tombolPrevious.setEnabled(True)  //menghidupkan tombol ‘Previous’
        self.updateTabel()  //menjalankan metode ‘updateTabel’


    def dapatkanData(self):  //metode ‘dapatkanFile’
        if len(self.penampungFile) :  //memastikan penampung file tidak kosong
            if self.indeks < len(self.penampungFile)  :  //mengecek nilai ‘indeks’ lebih kecil dari jumlah item di ‘penampungFile’
                self.indeks += 1  //menambah nilai ‘indek’ sebanya 1
                return self.penampungFile[self.indeks-1][0]  //mengembalikan lokasi file sesuai urutannya (penentu urutan = indeks)
            else :  //jika ‘indeks’ sama besarnya atau lebih besar dari jumlah item di ‘penampungFile’
                self.indeks = 0  //mengembalikan indeks menjadi ‘0’
                return self.penampungFile[self.indeks][0]  //mengembalikan lokasi file musik pertama atau urutan 1
        else:  //jika ‘penampungFIle’ kosong
            return None  //mengembalikan None jika ‘PenampungFile’ Kosng

    def klik(self, baris, kolom):  //membuat metode yang akan di jalankan ketika salah satu cell tabel di klik
        self.tabel.selectRow(baris)  //memilih seluru kolom ketika salah satu cell nya di klik
        self.tombolHapus.setEnabled(True)  //menghidupkan tombol ‘Hapus’ ketika salah satu item (file musik) di tabel di klik oleh user

    def klikTabel(self, baris, kolom):  //membuat metode dengan nama ‘klikTabel’ yang akan di jalankan ketika user klik 2 pada daftar musik yang ada  tabel dengan parameter no. Urutan ‘baris’ dan ‘kolom’
        self.tabel.selectRow(baris)  //agar terpilih seluruh kolom pada baris yang di klik
        data = self.tabel.item(baris, 0).text()  //mengambil teks ‘nama’ musik yang ada di kolom 0 (pertama) pada baris yang di klik
        for i in range(len(self.penampungFile)) :  //melakukan perulangan sebanyak jumlah item di ‘penampungFIle’ (file musik)
            if os.path.basename(self.penampungFile[i][0]) == data :  //mencocokkan nama yang di klik user dengan yang ada di ‘penampungFile’
                self.indeks=i  //mengubah indeks sesuai dengan lokasi file musik yang cocok
                self.putarMusik()  //menjalankan metode ‘putarMusik’ untuk  memutar musiknya

    def putarMusik(self):  //metode putarMusik
        data = self.dapatkanData()  //memanggil metode ‘dapatkanData’ untuk menapatkan lokasi musik yang ingin di putar
        if data :  //memastikan lokasi file tidak kosong
            self.pemutar.setCurrentSource(data)  //memuat lokasi musik ke pemutar
            self.pemutar.play()  //memutar musik
            self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPause))  //mengubah icon perintah ‘tombolStopPlay’ menjadi “pause”
        else:  //jika file musik kosong
            self.perintahStop()  //menjalankan metode ‘perintahStop’

    def perintahStop(self):  //membuat metoe ‘perintahStop’
        self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPlay))  //mengubah icon perintah ‘tombolStopPlay’ menjadi “stop”
        self.pemutar.stop()  //menghentikan pemutar musik

    def perintahMundur(self):  //membuat metode ‘perintahMundur’
        waktuPutar = self.pemutar.currentTime()  //mendapatkan waktu pemutaran
        if waktuPutar > 5000 :  //memastikan waktu lebih besar dari ‘5000’ mili detik atau 5 detik
            self.pemutar.seek(waktuPutar-5000)  //memundurkan progress pemutran sebanyak 5 detik

    def perintahMaju(self):  //membuat metode ‘perintahMaju’
        waktuPutar = self.pemutar.currentTime()  //mendapatkan waktu pemutaran
        total = self.pemutar.totalTime()  //mendapatkan panjang total waktu musik yang sedang di putar
        if total-5000>waktuPutar :  //memastikan waktu pemutaran musik kurang dari total waktu musik yang di kurangi 5 detik (5000milidetik)
            self.pemutar.seek(waktuPutar+5000)  //memajukan progress pemutaran sebanyak 5 detik

    def perintahNext(self):  //membuat metode ‘perintahNext’
        self.putarMusik()  //menjalankan metode ‘putarMusik’ untuk memutar lagu berikutnya

    def perintahPrevious(self):  //membuat metode ‘perintahPrevious’
        if self.indeks == 1 :  //mengecek apakah indeks (urutan pemutaran musik) adalah 1
            self.indeks = len(self.penampungFile)-1  //memutar lagu urutan terakhir jika pemutar memutar lagu pertama
        else:  //jika pemutar tidak memutar lagu pertama
            self.indeks -= 2  //mengurangi nilai indeks sebanyak 2 agar memutar lagu sebelumnya
        self.putarMusik()  //menjalankan metode ‘putarMusik’ agar memutar musik

    def statusBerubah(self, statusBaru, oldState):  //metode ‘statusBerubah’
        if statusBaru == Phonon.ErrorState:  //mengecek apakah ada error
            if self.mediaObject.errorType() == Phonon.FatalError:  //mengecek apakah ada error dengan jenis fatal error
                QtGui.QMessageBox.warning(self, self.tr("Fatal Error"), self.mediaObject.errorString())  //menampilkan pesan fatal error
            else:  //jika bukan fatal error
                QtGui.QMessageBox.warning(self, self.tr("Error"), self.mediaObject.errorString())  //menampilkan pesan error saja

        elif statusBaru == Phonon.PlayingState:  //mengecek apakah musik sedang di putar
            self.sedangDiputar = True  //mengubah nilai ‘sedangDiputar’ menjadi ‘True’ karena musik sedang di putar

//tombol di bawah di hidupkan karena pemutar musik sedang di putar

            self.tombolMundur.setEnabled(True)  //menghidupkan tombol ‘Mundur’
            self.tombolMaju.setEnabled(True)  //menghidupkan tombol ‘Maju’
            self.tombolStop.setEnabled(True)  //menghidupkan tombol ‘Stop’

        elif statusBaru == Phonon.StoppedState:  //mengecek apakah pemutaran musik sudah berhenti
            self.sedangDiputar = False  //mengubah nilai ‘sedangDiputar’ menjadi ‘False’ karena musik tidak sedang di putar

//tombol di matikan karena pemutar musik sedang di stop/ dihentikan

            self.tombolMundur.setEnabled(False)  //mematikan  tombol ‘Mundur’
            self.tombolMaju.setEnabled(False)  //mematikan  tombol ‘Maju’
            self.tombolStop.setEnabled(False)  //mematikan  tombol ‘Stop’

        elif statusBaru == Phonon.PausedState:  //mengecek apakah pemutaran  musik sedang di pause
            self.sedangDiputar = False  //mengubah nilai ‘sedangDiputar’ menjadi ‘False’ karena musik tidak sedang di putar

//tombol di bawah di hidupkan karena pemutar musik sedang di pause / di jeda

            self.tombolMundur.setEnabled(True)  //menghidupkan tombol ‘Mundur’
            self.tombolMaju.setEnabled(True)  //menghidupkan tombol ‘Maju’
            self.tombolStop.setEnabled(False)  //mematikan tombol ‘Stop’


if __name__ == '__main__':  //kondisi yang membuat code di bawahnya di jalankan paling awal
    app = QtGui.QApplication(sys.argv)  //inisialisasi window PySide
    window = PemutarMusik()  //memanggil class ‘PemutarMusik’
    window.setWindowTitle("Musik Player -> mn-belajarpython.blogspot.co.id")  //mengubah judul
    window.show()  //menampilkan window aplikasi

    sys.exit(app.exec_())  //agar window tidak langsung clos saat dijalankan


Nah itu dia temen - temen penjelasan code programnya.. Mohon maaf ya apabila ada penjelasan yang kurang jelas, atau bahkan ada kekeliruan... Mohon kasi pembenaran atau pendapat kalian di kolom komentar ya temen - temen... Biar kita bisa belajar bersama - sama..

Oke terimakasih dan sampai di sini dulu ya temen - temen... Jangan lupa untuk membaca versi - versi yang lainnya... Biar ilmunya juga nambah.. Hehe.. Temikasih sekali lagi dan sekian...

Wassalamualaikum wr. wb.
Previous
Next Post »
Thanks for your comment