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...
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 15. Dimana pada versi kali ini saya menambahkan fitur untuk mengacak pemutaran lagu.. Jadi, dia tidak akan memutar musik sesuai urutan musiknya..
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...
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...
if len(self.penampungFile) > 1 : //mengecek apakah file musik yang ada di pemutar ini lebih dari 1
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.
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 15. Dimana pada versi kali ini saya menambahkan fitur untuk mengacak pemutaran lagu.. Jadi, dia tidak akan memutar musik sesuai urutan musiknya..
Rincian Lengkap Aplikasi Pemutar Musik PySide Versi 15.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 15.0 |
Versi | : 15.0 | klik disini untuk membaca versi selanjutnya. |
Platform | : Python 3.x |
Modul | : PySide. Klik disini untuk menginstallnya. |
Baris Code | : kurang lebih 425 baris code program. |
Terdiri dari | : 1 class dan 31 metode. |
Fitur | : Memutar musik secara acak. Laporkan di komentar jika ada error. |
Kelemahan | : rentan bug (kesalahan/error) |
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 15.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 from random import randint class PemutarMusik(QtGui.QMainWindow) : def __init__(self): QtGui.QMainWindow.__init__(self) self.penampungFile = [] self.sedangDiputar = False self.indeks = 0 self.indeksTadi=[] self.indeksHapusWarna = -1 self.volumeYgLalu = 0.5 self.klikDariTabel = False 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) self.pemutar.setTickInterval(1000) self.connect(self.pemutar, QtCore.SIGNAL('tick(qint64)'), self.perbaruiWaktu) # self.connect(self.pemutar, QtCore.SIGNAL('aboutToFinished()'), print('a')) def inisialisasiMedia(self): self.suara = Phonon.AudioOutput(Phonon.MusicCategory, self) self.suara.volumeChanged.connect(self.ubahNilaiVolume) self.pemutar = Phonon.MediaObject(self) Phonon.createPath(self.pemutar, self.suara) def ubahNilaiVolume(self, nilai): self.nilaiVolume.setText(str(int(nilai*100//1))+"%") 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.tombolBukaFolder = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_DirOpenIcon), "Cari folder Mp3", self, triggered=self.dataDariFolder) self.tombolHapus = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_DialogDiscardButton), "Hapus Musik", self, triggered=self.perintahHapus) self.tombolLagi = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_BrowserReload), "Ulangi setelah selesai", self, checkable=True) self.tombolAcak = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_CommandLink), "Putar Acak", self, checkable=True) 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 ''') self.waktuPutar = QtGui.QLabel("00:00") self.waktuTotal = QtGui.QLabel("00:00") self.nilaiVolume = QtGui.QLabel('100%') 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.tombolBukaFolder) self.layoutTombol.addSeparator() self.layoutTombol.addAction(self.tombolLagi) self.layoutTombol.addAction(self.tombolAcak) self.layoutTombol.addSeparator() 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) self.tombolLagi.setChecked(True) def susunSlider(self): self.layoutSlider.setColumnStretch(1,1) self.layoutSlider.addWidget(self.waktuPutar,0,0) self.layoutSlider.addWidget(self.posisi,0,1) self.layoutSlider.addWidget(self.waktuTotal,0,2) self.layoutSlider.addWidget(self.volume,0,3) self.layoutSlider.addWidget(self.nilaiVolume, 0 ,4) 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) if self.penampungFile: self.ubahWarna() 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() ada = False for i in path : lokasi=QtCore.QFileInfo(i).absolutePath() tipe=QtCore.QFileInfo(i).suffix() if tipe.lower() == 'mp3' : self.masukanFile([i,lokasi]) ada = True if ada == False: QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Gagal Menambah Musik", "File yang anda pilih bukan file musik " "Silahkan pilih folder yang berisi file MP3.").exec_() elif self.sedangDiputar == False: self.putarMusik() def dataDariFolder(self): folder = QtGui.QFileDialog.getExistingDirectory(self, "Tentukan Folder", QtCore.QDir.currentPath()) f = folder if folder: folder = QtCore.QDir(folder) file = folder.entryList(QtCore.QDir.Files | QtCore.QDir.NoSymLinks) ada = False for i in file : tipe = QtCore.QFileInfo(f+i).suffix() if tipe.lower() == 'mp3': self.masukanFile([f+"/"+i, f]) ada = True if ada == False: QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Gagal Menambah Musik", "File Musik tidak ditemukan pada folder : "+f+" " "Silahkan pilih folder yang berisi file MP3.").exec_() elif 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: if self.penampungFile: self.putarMusik() 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.tombolAcak.isChecked() and self.klikDariTabel==False: print("acak tadi ",self.indeks-1) acak = randint(0, len(self.penampungFile)-1) while (self.indeks-1 == acak) and len(self.penampungFile)>1 : acak = randint(0, len(self.penampungFile)-1) self.indeks = acak print("indeks = ",self.indeks) self.indeks +=1 return self.penampungFile[self.indeks-1][0] else: self.klikDariTabel = False if self.indeks < len(self.penampungFile) : self.indeks += 1 return self.penampungFile[self.indeks-1][0] else : if self.tombolLagi.isChecked() : self.indeks = 1 return self.penampungFile[self.indeks-1][0] else: self.indeks = 0 return None 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.klikDariTabel = True self.putarMusik() def putarMusik(self): data = self.dapatkanData() if data : self.ubahWarna() self.pemutar.setCurrentSource(data) self.pemutar.play() self.tombolStopPlay.setIcon(self.style().standardIcon(QtGui.QStyle.SP_MediaPause)) else: self.perintahStop() def ubahWarna(self): if self.indeksHapusWarna >= 0 and self.indeksHapusWarna < self.tabel.rowCount(): self.tabel.item(self.indeksHapusWarna, 0).setBackground(QtGui.QColor(255, 255, 255)) self.tabel.item(self.indeksHapusWarna, 1).setBackground(QtGui.QColor(255, 255, 255)) self.tabel.item(self.indeksHapusWarna, 2).setBackground(QtGui.QColor(255, 255, 255)) if self.indeks != 0 : self.tabel.item(self.indeks - 1, 0).setBackground(QtGui.QColor(85, 170, 255)) self.tabel.item(self.indeks - 1, 1).setBackground(QtGui.QColor(85, 170, 255)) self.tabel.item(self.indeks - 1, 2).setBackground(QtGui.QColor(85, 170, 255)) self.indeksHapusWarna = self.indeks - 1 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 perbaruiWaktu(self, waktu): displayTime = QtCore.QTime((waktu/(1000*60*60))% 60, (waktu / 60000) % 60, (waktu / 1000) % 60) self.waktuPutar.setText(displayTime.toString('mm:ss')) total = self.pemutar.totalTime() if total != -1 : displayTime = QtCore.QTime((total / (1000 * 60 * 60)) % 60, (total / 60000) % 60, (total / 1000) % 60) self.waktuTotal.setText(displayTime.toString('mm:ss')) else : self.waktuTotal.setText('00:00') def perintahPrevious(self): if self.tombolAcak.isChecked()==False: 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 15.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 sebelumnya. Dan 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
from random import randint //mengimport randint dari class random python yang digunakan untuk randoman angka
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.indeksHapusWarna = -1 //digunakan untuk menentukan penghapusan warna
self.volumeYgLalu = 0.5 //digunakan untukmenyimpan volume sebelumnya
self.klikDariTabel = False //definisi variabel untuk menentukan pemutaran berasar dari klik tabel atau tidak. (False = bukan dan True = berasal dari klik tabel 2x)
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
self.pemutar.setTickInterval(1000) //mengatur interval (pemanggilan kembali) setiap 1000 mili detik atau 1 detik
self.connect(self.pemutar, QtCore.SIGNAL('tick(qint64)'), self.perbaruiWaktu) //akan menjalankan metode ‘perbaruiWaktu’ setiap 1000 mili detik atau 1 detik sekali
def inisialisasiMedia(self): //membuat metode ‘insialisasiMedia’
self.suara = Phonon.AudioOutput(Phonon.MusicCategory, self) //mendefinisikan suara pemutar musik
self.suara.volumeChanged.connect(self.ubahNilaiVolume) //ketika slider volume berubah nilainya, maka akan menjalankan metode ‘ubahNilaiVolume’
self.pemutar = Phonon.MediaObject(self) //membuat pemutar lagu
Phonon.createPath(self.pemutar, self.suara) //menghubungkan pemutar dengan audio
def ubahNilaiVolume(self, nilai): //membuat metode ‘ubahNilaiVolume’
self.nilaiVolume.setText(str(int(nilai*100//1))+"%") //memperbarui teks nilai volume
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.tombolBukaFolder = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_DirOpenIcon), "Cari folder Mp3", self, triggered=self.dataDariFolder) //membuat perintah ‘cari folder Mp3’ atau Buka Folder yang akan menjalankan metode ‘dataDariFolder’ 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.tombolLagi = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_BrowserReload), "Ulangi setelah selesai", self, checkable=True) //digunakan untuk membuat perintah ‘Ulangi setelah selesai’ dengan settingan ‘cheackable’ yang artinya bisa di centang atau tidak.
self.tombolAcak = QtGui.QAction(self.style().standardIcon(QtGui.QStyle.SP_CommandLink), "Putar Acak", self, checkable=True) //digunakan untuk membuat perintah ‘Putar Acaki’ dengan settingan ‘cheackable’ yang artinya bisa di centang atau tidak.
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’
self.waktuPutar = QtGui.QLabel("00:00") //membuat variabel ‘waktuPutar’. Untuk menampilkan label waktu putar musik
self.waktuTotal = QtGui.QLabel("00:00") //membuat variabel ‘waktuTotal’. Untuk menampilkan label waktu total musik
self.nilaiVolume = QtGui.QLabel('100%') //membuat variabel ‘nilaiVolume’. Untuk menampilkan tingkat colume
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.tombolBukaFolder) //memasukkan perintah BukaFolder/(tombolBukaFolder) ke dalam window
self.layoutTombol.addSeparator() //memberikan garis pembatas
self.layoutTombol.addAction(self.tombolLagi) //memasukkan perintah Ulangi setelah selesai /(tombolLagi) ke dalam window
self.layoutTombol.addAction(self.tombolAcak) //memasukkan perintah perintah acak /(tombolAcak) ke dalam window
self.layoutTombol.addSeparator() //menambahkan sebuah garis pembatas
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’
self.tombolLagi.setChecked(True) //membuat tombolLagi tercentang
def susunSlider(self): //membuat metode susun slider
self.layoutSlider.setColumnStretch(1,1) //menentukan lokasi yang akan di perbesar/perkecil ketika di resize
self.layoutSlider.addWidget(self.waktuPutar,0,0) //memasukkan label waktu pemutaran musik
self.layoutSlider.addWidget(self.posisi,0,0) //memasukkan slider progress pemutar musik ke layout slider.
self.layoutSlider.addWidget(self.waktuTotal,0,2) //memasukkan waktu total musik ke dalam window
self.layoutSlider.addWidget(self.volume,0,1) //memasukkan slider volume pemutar musik ke layout slider.
self.layoutSlider.addWidget(self.nilaiVolume, 0 ,4) //memasukkan nilai tingkat kekerasan volume
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
if self.penampungFile: //mengecek apakah file musik tidak kosong
self.ubahWarna() //memanggil metode dengan nam a’ubahWarna’ jika file musik yang di tampung tidak kosong
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
ada = False //membuat variabel ‘ada’ untuk menentukan keberhasilan menambah file musik.
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’
ada = True //mengubah nilai menjadi true. (karena file musik berhasil ditambah)
if ada == False: //mengecek apakah tidak berhasil menambah musik
QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Gagal Menambah Musik",
"File yang anda pilih bukan file musik<br/><br/>"
"<b>Silahkan pilih folder yang berisi file MP3.</b>").exec_()
//code di atas di gunakan untuk memberitahukan user jika gagal menambah file musik
elif self.sedangDiputar == False: //mengecek apakah musik sedang tidak di putar
self.putarMusik() //menjalankan metode ‘putarMusik’
def dataDariFolder(self): //membuat metode ‘dataDariFolder’ yang digunakan untuk memasukkan file musik dari sebuah folder
folder = QtGui.QFileDialog.getExistingDirectory(self, "Tentukan Folder", QtCore.QDir.currentPath()) //menampilkan sebuah file dialog untuk memilih folder dan lokasi folder disimpan di variabel ‘folder’
f = folder //menyimpan copy an lokasi folder yang di pilih oleh user
if folder: //memastikan lokasi folder tidak kosong (memastikan user memilih folder) dan tidak klik tombol cancel
folder = QtCore.QDir(folder) //memanggil class ‘QDir’ dan memasukkan lokasi folder yang terpilih sebagai parameter
file = folder.entryList(QtCore.QDir.Files | QtCore.QDir.NoSymLinks) //memilih semua file yang ada di folder terpilih dan disimpan ke variabel ‘file’
ada = False //membuat variabel ‘ada’ untuk menentukan keberhasilan menambah file musik.
for i in file : //melakukan perulangan sebanyak file yang ada di folder terpilih
tipe = QtCore.QFileInfo(f+i).suffix() //mendapatkan tipe/ekstensi tiap file
if tipe.lower() == 'mp3': //mengecek dan memastikan apakah ekstensi/tipe nya adalah ‘mp3’
self.masukanFile([f+"/"+i, f]) //memasukkan/menampung file jika tipe/ekstensi file adalah mp3
ada = True //mengubah nilai menjadi true. (karena file musik berhasil ditambah)
if ada == False: //mengecek apakah tidak berhasil menambah musik
QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Gagal Menambah Musik",
"File Musik tidak ditemukan pada folder :<br/><br/><i>"+f+"</i><br/><br/>"
"<b>Silahkan pilih folder yang berisi file MP3.</b>").exec_()
//code di atas di gunakan untuk memberitahukan user jika gagal menambah file musik
elif self.sedangDiputar == False: //mengecek apakah pemutar musik tidak sedang memutar musik
self.putarMusik() //memanggil metode ‘putarMusik’ jika pemutar musik tidak memutar musik
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
if self.penampungFile: //memastikan file musik di penampungFile tidak kosong
self.putarMusik() //menjalankan metode ‘putarMusik’ jika ‘penampungFile’ dalan keadaan kosong
else: //jika ‘penampungFile’ 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.tombolAcak.isChecked() and self.klikDariTabel==False: //memastikan ‘tombolAcak’ sedang tercentang dan proses pemutaran tidak berasal dari klik tabel daftar musik
acak = randint(0, len(self.penampungFile)-1) //merandom no. Untuk memutar no. Urut musik
while (self.indeks-1 == acak) and len(self.penampungFile)>1 : //mengecek hasil pengacakan apakah sama dengan hasil sebelumnya dan memastikan jumlah file musik lebih dari 1
acak = randint(0, len(self.penampungFile)-1) //mengulang pengacakan no. Jika hasilnya sama dengan hasil sebelumnya
self.indeks = acak //mengubah nilai indeks menjadi nilai hasil acak
self.indeks +=1 //menambah nilai acak sebanyak 1
return self.penampungFile[self.indeks-1][0] //mengembalikan path/lokasi musik sesuai urutan no. Hasil acak tadi
else: //jika tombolAcak tidak tercentang atau klikDariTabel bernilai True
self.klikDariTabel = False //mengubah nilai KlikDaiTabel menjadi false. Agar tidak berulang seterusnya walaupun tidak di putar dari klik tabel
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’
if self.tombolLagi.isChecked() : //mengecek apakah ‘tombolLagi’ sedang tercentang
self.indeks = 1 //mengubah nilai variabel ‘indeks’ menjadi 1 agar memutar musik dari awal
return self.penampungFile[self.indeks-1][0] //mengembalikan file musik urutan pertama
else: //jika tombolLagi tidak tercentang
self.indeks = 0 //mengubah nilai variabel ‘indeks’ menjadi 0
return None //tidak mengembalikan apa apa (kosong)
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.klikDariTabel = True //mengubah nilai ‘klikDariTabel’ sebagai penanda kalau pemutaran musik berasal dari klik tabel daftar musik
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.ubahWarna() //memanggil metode ‘ubahWarna’
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 ubahWarna(self): //metode ‘ubahWarna’
if self.indeksHapusWarna >= 0 and self.indeksHapusWarna < self.tabel.rowCount(): //mengecek variabel ‘indeksHapusWarna’ apakah lebih besar dari -1 dann indeks hapus warna tidak melebihi jumlah baris tabel (file musik).
self.tabel.item(self.indeksHapusWarna, 0).setBackground(QtGui.QColor(255, 255, 255)) //mengubah kolom 1 dan baris file musik yang sudah di putar menjadi putih kembali
self.tabel.item(self.indeksHapusWarna, 1).setBackground(QtGui.QColor(255, 255, 255)) //mengubah kolom 2 dan baris file musik yang sudah di putar menjadi putih kembali
self.tabel.item(self.indeksHapusWarna, 2).setBackground(QtGui.QColor(255, 255, 255)) //mengubah kolom 3 dan baris file musik yang sudah di putar menjadi putih kembali
if self.indeks != 0 : //memastikan indeks tidak sama dengan 0
self.tabel.item(self.indeks - 1, 0).setBackground(QtGui.QColor(85, 170, 255)) //mengubah kolom 1 dan baris file musik yang sedang di putar menjadi warna biru
self.tabel.item(self.indeks - 1, 1).setBackground(QtGui.QColor(85, 170, 255)) //mengubah kolom 2 dan baris file musik yang sedang di putar menjadi warna biru
self.tabel.item(self.indeks - 1, 2).setBackground(QtGui.QColor(85, 170, 255)) //mengubah kolom 3 dan baris file musik yang sedang di putar menjadi warna biru
self.indeksHapusWarna = self.indeks - 1 //memperbarui nilai variabel ‘indeksHapusWarna’ agar tetap sama dengan nilai indeks yang di kurangi 1. (dibawah nilai indeks sebanyak 1)
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 perbaruiWaktu(self, waktu): //metode ‘perbaruiWaktu’ untuk memperbaui nilai waktu pemutar musik
displayTime = QtCore.QTime((waktu/(1000*60*60))% 60, (waktu / 60000) % 60, (waktu / 1000) % 60) //inisialisasi waktu pemutaran musik
self.waktuPutar.setText(displayTime.toString('mm:ss')) //memasukkan waktu putar musik kedalam window.
total = self.pemutar.totalTime() //mendapatkan panjang musik/waktu total.
if total != -1 : //memastikan panjang musik tidak = -1
displayTime = QtCore.QTime((total / (1000 * 60 * 60)) % 60, (total / 60000) % 60, (total / 1000) % 60) //inisialisasi total panjang musik
self.waktuTotal.setText(displayTime.toString('mm:ss')) //memasukkan waktu total musik ke dalam window
else : //jika waktu total = -1
self.waktuTotal.setText('00:00') //membiarkan waktu total tetap default
def perintahPrevious(self): //membuat metode ‘perintahPrevious’
if self.tombolAcak.isChecked()==False: //memastikan tombolAcak tidak tercentang
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.
ConversionConversion EmoticonEmoticon