Hace algunos años hice un tutorial de QtCreator, espero que les guste.
Por favor comparte este articulo.
:D
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from PySide.QtGui import QApplication
from PySide.phonon import Phonon
from PySide import QtCore, QtGui
class player(Phonon.VideoWidget):
def __init__(self, file_path):
super(player, self).__init__(parent=None)
self.setWindowTitle("Video")
QtGui.QApplication.addLibraryPath(
os.path.join(os.path.dirname(__file__), 'plugins'))
media_src = Phonon.MediaSource(file_path)
self.file_path = file_path
media_obj = Phonon.MediaObject()
media_obj.setCurrentSource(media_src)
Phonon.createPath(media_obj, self)
self.media_obj = media_obj
audio_out = Phonon.AudioOutput(Phonon.VideoCategory)
Phonon.createPath(media_obj, audio_out)
self.audio_out = audio_out
self.media_obj.setTickInterval(1000)
self.media_obj.tick.connect(self.alAvanzar)
self.media_obj.stateChanged.connect(self.alCambiarEstado)
def alAvanzar(self, tiempo):
pass
def alCambiarEstado(self, new, old):
pass
def play(self):
self.media_obj.play()
def pause(self):
self.media_obj.pause()
def stop(self):
self.media_obj.stop()
def state(self):
return self.media_obj.state()
from PySide import QtCore, QtGui, phonon, QtUiTools
from PySide.phonon import Phonon
from videopanel import player
class Reproductor(QtGui.QWidget):
def __init__(self):
super(Reproductor, self).__init__(parent=None)
self.setWindowTitle("Python Simple Player")
self.gridLayout = QtGui.QGridLayout(self)
loader = QtUiTools.QUiLoader()
file = QtCore.QFile("repro.ui")
file.open(QtCore.QFile.ReadOnly)
self.ui = loader.load(file, self)
file.close()
self.gridLayout.addWidget(self.ui, 0, 0, 1, 1)
# seccion multimedia
self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
self.mediaObject = Phonon.MediaObject(self)
Phonon.createPath(self.mediaObject, self.audioOutput)
self.mediaObject.setTickInterval(1000)
#
self.ui.lcdAvance.display("00:00")
QtCore.QObject.connect(
self.ui.btnArchivo,
QtCore.SIGNAL("clicked()"),
self.openFile)
QtCore.QObject.connect(
self.ui.btnPlay,
QtCore.SIGNAL("clicked()"),
self.play)
self.mediaObject.tick.connect(self.alAvanzar)
self.mediaObject.stateChanged.connect(self.alCambiarEstado)
#----------------------
self.player = None
def alAvanzar(self, tiempo):
displayTime = QtCore.QTime(
0, (tiempo / 60000) %
60, (tiempo / 1000) %
60)
self.ui.lcdAvance.display(displayTime.toString('mm:ss'))
def alCambiarEstado(self, new, old):
if self.mediaObject.state() == Phonon.State.StoppedState:
self.ui.btnPlay.setEnabled(True)
elif self.mediaObject.state() == Phonon.State.PlayingState:
self.ui.btnPlay.setText("||") # .setEnabled(False)
def play(self):
if self.player:
if self.player.state() == Phonon.State.PlayingState:
self.player.pause()
self.player.show()
self.ui.btnPlay.setText(">")
else:
self.player.show()
self.player.play()
self.ui.lblNombre.setText(self.player.file_path)
self.ui.btnPlay.setText("||")
else:
if self.mediaObject.state() == Phonon.State.PlayingState:
self.mediaObject.pause()
self.ui.btnPlay.setText(">")
else:
self.mediaObject.play()
#///////////////////////////////////
meta = self.mediaObject.metaData()
print(meta)
meta["TITLE"] = meta[
"TITLE"] if "TITLE" in meta else "Indefinido"
meta["ARTIST"] = meta[
"ARTIST"] if "ARTIST" in meta else "SinNombre"
label = "{TITLE} by {ARTIST}".format(**meta)
self.ui.lblNombre.setText(label)
#///////////////////////////////////
self.ui.btnPlay.setText("||")
def openFile(self):
fileName = QtGui.QFileDialog.getOpenFileName(
self,
u"Abrir Archivo",
u".",
u"Archivos de Audio (*.mp3 *.wav *.ogg);;Archivos de Video (*.mp4 *.mpg *.avi)")
if fileName[1]:
self.path = fileName[0]
self.mediaObject.setCurrentSource(
Phonon.MediaSource(self.path))
self.ui.btnPlay.setText(">")
self.ui.lblNombre.setText("...")
self.ui.lcdAvance.display("00:00")
if fileName[0][-3:] in "mp4 mpg avi".split():
self.player = player(fileName[0])
self.player.alAvanzar = self.alAvanzar
self.player.alCambiarEstado = self.alCambiarEstado
else:
self.player = None
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
rep = Reproductor()
rep.show()
sys.exit(app.exec_())
Ahora lo primero que vemos es una modificación en el constructor, en el cual creamos una variable de clase llamada player que es nula (linea 38). Luego vemos en el método play una condición en la cual si el player es diferente de nulo llama al objeto player para que este inicie la reproducción o la detenga. Finalmente en el método openFile vemos que se verifica la extensión del archivo a reproducir, si es un archivo de vídeo la variable de clase player deja de ser nula y se convierte en una instancia de la clase player que ya habíamos hecho antes, de lo contrario sigue siendo nula.#!/usr/bin/env python
from PySide import QtCore, QtGui, phonon, QtUiTools
from PySide.phonon import Phonon
class Reproductor(QtGui.QWidget):
def __init__(self):
super(Reproductor, self).__init__(parent=None)
self.setWindowTitle("Python Simple Player")
self.gridLayout = QtGui.QGridLayout(self)
loader = QtUiTools.QUiLoader()
file = QtCore.QFile("repro.ui")
file.open(QtCore.QFile.ReadOnly)
self.ui = loader.load(file, self)
file.close()
self.gridLayout.addWidget(self.ui, 0, 0, 1, 1)
# seccion multimedia
self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
self.mediaObject = Phonon.MediaObject(self)
Phonon.createPath(self.mediaObject, self.audioOutput)
self.mediaObject.setTickInterval(1000)
#
self.ui.lcdAvance.display("00:00")
QtCore.QObject.connect(
self.ui.btnArchivo,
QtCore.SIGNAL("clicked()"),
self.openFile)
QtCore.QObject.connect(
self.ui.btnPlay,
QtCore.SIGNAL("clicked()"),
self.play)
self.mediaObject.tick.connect(self.alAvanzar)
self.mediaObject.stateChanged.connect(self.alCambiarEstado)
def alAvanzar(self, tiempo):
displayTime = QtCore.QTime(
0, (tiempo / 60000) %
60, (tiempo / 1000) %
60)
self.ui.lcdAvance.display(displayTime.toString('mm:ss'))
def alCambiarEstado(self, new, old):
if self.mediaObject.state() == Phonon.State.StoppedState:
self.ui.btnPlay.setEnabled(True)
elif self.mediaObject.state() == Phonon.State.PlayingState:
self.ui.btnPlay.setText("||") # .setEnabled(False)
def play(self):
if self.mediaObject.state() == Phonon.State.PlayingState:
self.mediaObject.pause()
self.ui.btnPlay.setText(">")
else:
self.mediaObject.play()
#///////////////////////////////////
meta = self.mediaObject.metaData()
meta["TITLE"] = meta["TITLE"] if "TITLE" in meta else "Indefinido"
meta["ARTIST"] = meta[
"ARTIST"] if "ARTIST" in meta else "SinNombre"
label = "{TITLE} by {ARTIST}".format(**meta)
self.ui.lblNombre.setText(label)
#///////////////////////////////////
self.ui.btnPlay.setText("||")
def openFile(self):
fileName = QtGui.QFileDialog.getOpenFileName(
self,
u"Abrir Archivo",
u"/",
u"Archivos de Audio (*.mp3 *.wav *.ogg)")
if fileName[1]:
self.path = fileName[0]
self.mediaObject.setCurrentSource(
Phonon.MediaSource(self.path))
self.ui.btnPlay.setText(">")
self.ui.lblNombre.setText("...")
self.ui.lcdAvance.display("00:00")
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
rep = Reproductor()
rep.show()
sys.exit(app.exec_())
En el código anterior podemos ver cómo mediante el uso del modulo QtUiTools es posible usar la clase QUiLoader para cargar en tiempo de ejecución el archivo de interfaz gráfica (repro.ui), y obtenemos un objeto QWidget, el cual contiene toda la jerarquía de objetos que habíamos hecho en el diseñador de interfaces, los cuales quedan listos para ser usados a gusto. Después de esto acoplamos el QWidget obtenido mediante un gridLayout. Seguidamente creamos las instancias de la salida de audio (audioOutput) y del reproductor (mediaObject), los cuales son enlazados mediante la instrucción:Phonon.createPath(self.mediaObject, self.audioOutput)Esta instrucción enlaza el reproductor con la salida de audio. Después de esto se establece cada cuánto se va a lanzar una señal de actualización (es para que pueda medirse el tiempo transcurrido y hacer cosas de acuerdo a este) mediante el tickInterval, el cual se establece cada 1000 milisegundos (un segundo) y se conectan objetos como botones a los eventos correspondientes para que antes de finalizar el constructor se enlacen las señales del reproductor a los métodos encargados de modificar el avance y cambiar la etiqueta del botón de reproducción.
apt-get install python-pyside
# -*- coding: utf-8 -*-
# Tested in Python2.7
from PySide import QtCore, QtGui
from PySide import QtWebKit
from PySide import QtNetwork
class Navegador(QtGui.QWidget):
def __init__(self):
# constructor de la clase
super(Navegador, self).__init__(parent=None)
self.setWindowTitle("Python Navigator")
self.showMaximized()
self.gridLayout = QtGui.QGridLayout(self)
self.btnAtras = QtGui.QPushButton(self, text='atras')
self.gridLayout.addWidget(self.btnAtras, 0, 0, 1, 1)
self.btnAdelante = QtGui.QPushButton(self, text='adelante')
self.gridLayout.addWidget(self.btnAdelante, 0, 1, 1, 1)
self.label = QtGui.QLabel(u"Dirección", self)
self.gridLayout.addWidget(self.label, 0, 2, 1, 1)
self.txtUrl = QtGui.QLineEdit(self)
self.gridLayout.addWidget(self.txtUrl, 0, 3, 1, 1)
self.wvNavegador = QtWebKit.QWebView(self)
self.gridLayout.addWidget(self.wvNavegador, 1, 0, 1, 4)
QtNetwork.QNetworkProxyFactory.setUseSystemConfiguration(True)
QtWebKit.QWebSettings.globalSettings().setAttribute(
QtWebKit.QWebSettings.PluginsEnabled, True)
QtWebKit.QWebSettings.globalSettings().setAttribute(
QtWebKit.QWebSettings.JavascriptCanOpenWindows, True)
QtWebKit.QWebSettings.globalSettings().setAttribute(
QtWebKit.QWebSettings.DeveloperExtrasEnabled, True)
QtCore.QObject.connect(
self.txtUrl,
QtCore.SIGNAL("returnPressed()"),
self.cargarUrl)
QtCore.QObject.connect(
self.btnAtras,
QtCore.SIGNAL("clicked()"),
self.wvNavegador.back)
QtCore.QObject.connect(
self.btnAdelante,
QtCore.SIGNAL("clicked()"),
self.wvNavegador.forward)
_url = "http://www.python.org"
self.wvNavegador.load(QtCore.QUrl(_url))
self.txtUrl.setText(_url)
def cargarUrl(self):
url = self.txtUrl.text()
url = url if url.startswith(
"http://") or url.startswith(
"https://") else "http://{url}".format(
url=url)
self.wvNavegador.load(QtCore.QUrl(url))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
nav = Navegador()
nav.show()
sys.exit(app.exec_())
Podemos ver que en el bloque de código anterior se crea la clase navegador, en la cual se crean los controles básicos (la caja de texto para la URL, botones de atrás y adelante, el espacio de navegación), después de esto se "empaquetan" por así decirlo en un gridlayout, el cual nos permite hacer que los controles se ajusten de manera dinámica cuando cambie el tamaño de la ventana. Después se habilitan los plugins del elemento mediante el cual se navega para que sea posible ver vídeos en youtube e inspeccionar elementos (muestra el DOM, los scripts y demás de manera muy similar a la de Google Chrome) mediante click derecho, luego se enlazan los botones al navegador mediante los eventos de click y la barra de direcciones al navegador mediante el evento returnPressed y después se carga la URL inicial ("http://www.python.org").