Hola a todxs
resulta que casi no sé sobre las clases etc. he estado leyendo, pero aún no encuentro el error que tengo o como puedo llamar, lo que quiero es poder que una barra de carga (de progreso) hecha en PyQt Designer (me aconsejaron cambiarme de Boa a este) corra cuando este vaya descargando un archivo.
les colocaré parte del código ya que es un poco largo, (lo mas relevante)
esta es la parte del código (la que interesa):
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
#~ construccion de la ventana
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(463, 527)
#~ barra de progreso
self.progressBar = QtGui.QProgressBar(self.centralwidget)
#~ self.progressBar.setProperty("value", 12)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.verticalLayout.addWidget(self.progressBar)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
#acciones
QtCore.QObject.connect(self.toolButtonJugar, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.jugar)
QtCore.QObject.connect(self.toolButtonJugar, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.deleteLater)
QtCore.QObject.connect(self.toolButtonRegistrar, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.registrarse)
QtCore.QObject.connect(self.toolButtonConfigurar, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.configurar)
QtCore.QObject.connect(self.progressBar, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), MainWindow.progreso_barra)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
..................
class Myform(QtGui.QMainWindow,Ui_MainWindow):
def __init__(self):
QtGui.QWidget.__init__(self)
Ui_MainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.t = self.ui.setupUi(self)
self.progreso_barra()
def progreso_barra(self):
remote = r"http://quecorralavoz.zz.mu/download/mia.jpg"
local = r"c:\Python27\update1.jpg"
u = urllib2.urlopen(remote)
h = u.info()
totalSize = int(h["Content-Length"])
#print "Descargando %s bytes..." % totalSize,
fp = open(local, 'wb')
blockSize = 8192 #100000 # urllib.urlretrieve uses 8192
count = 0
while True:
chunk = u.read(blockSize)
if not chunk:
break
fp.write(chunk)
count += 1
if totalSize > 0:
percent = int(count * blockSize * 100 / totalSize)
if percent > 100:
percent = 100
print "%2d%%" % percent,
if percent < 100:
self.t.progressBar.setProperty("value", percent)
#~ print "\b\b\b\b\b", # Erase "NN% "
else:
print "Done."
fp.flush()
fp.close()
if not totalSize:
print
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
myapp = Myform()
myapp.show()
sys.exit(app.exec_())
como ven, lo que quiero es que la barra de progreso vaya corriendo a como vaya corriendo el porcentaje de descarga, pero (siempre hay un pero, me aparece un error de que
edito:
self.t.progressBar.setProperty("value", percent)
AttributeError: 'NoneType' object has no attribute 'progressBar'
mmmm lo malo de hacer el QT con el designer es la basura que suelta...
Lo único que veo mal ahí es un error de tabulación en self.progressBar.setObjectName(_fromUtf8("progressBar"))
Aun así creo esta bastante más imcompleto y a mi no me deja ejecutarlo, que PyQT usas? osea version
este es el código completo:
pd: la identacion no es, eso lo arreglo lo que tengo malo es que no sé como coño cambiar esa propiedad, aunque ya he tratado al revés, de que se llame desde la clase Ui_MainWindow al self.progreso_barra y nada. como le voy a hacer?
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
from PyQt4 import QtWebKit
import sys
import urllib2
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
#~ construccion de la ventana
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(463, 527)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(_fromUtf8("img/Icon_308.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet(_fromUtf8("background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0.908682, stop:0 rgba(255, 178, 102, 255), stop:0.572139 rgba(235, 148, 61, 255), stop:1 rgba(0, 0, 0, 255));"))
#~ centrar los objetos
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.horizontalLayout = QtGui.QHBoxLayout()
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
#~ pagina web
self.webView = QtWebKit.QWebView(self.centralwidget)
self.webView.setUrl(QtCore.QUrl(_fromUtf8("http://www.google.com")))
self.webView.setObjectName(_fromUtf8("webView"))
self.verticalLayout.addWidget(self.webView)
#~ barra de progreso
self.progressBar = QtGui.QProgressBar(self.centralwidget)
self.progressBar.setProperty("value", 12)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.verticalLayout.addWidget(self.progressBar)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
#acciones
QtCore.QObject.connect(self.progressBar, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), MainWindow.progreso_barra)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "Lanzador", None))
class Myform(QtGui.QMainWindow):
def __init__(self):
QtGui.QWidget.__init__(self)
#~ Ui_MainWindow.__init__(self)
self.ui2 = Ui_MainWindow()
self.t = self.ui2.setupUi(self)
self.progreso_barra()
def progreso_barra(self):
remote = r"http://quecorralavoz.zz.mu/download/mia.jpg"
local = r"c:\Python27\update1.jpg"
u = urllib2.urlopen(remote)
h = u.info()
totalSize = int(h["Content-Length"])
#print "Descargando %s bytes..." % totalSize,
fp = open(local, 'wb')
blockSize = 8192 #100000 # urllib.urlretrieve uses 8192
count = 0
while True:
chunk = u.read(blockSize)
if not chunk:
break
fp.write(chunk)
count += 1
if totalSize > 0:
percent = int(count * blockSize * 100 / totalSize)
if percent > 100:
percent = 100
print "%2d%%" % percent,
if percent < 100:
self.t.progressBar.setValue(percent)
#~ print "\b\b\b\b\b", # Erase "NN% "
else:
print "Done."
fp.flush()
fp.close()
if not totalSize:
print
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
myapp = Myform()
myapp.show()
sys.exit(app.exec_())
Deberias agregar a la clase Ui_MainWindow la función:
def barra(self, param):
self.progressBar.setValue(param)
y la llamas así:
self.ui2.barra(percent)
Por cierto, si no usas threading dudo te funcione
Saludos!
11Sep muchas gracias, y si, lo que hice fue eso pasé todo lo que tenía que ver con MainWindow.funcion en los conect a self.funcion, es decir que definí las funciones dentro de la misma clase Ui_MainWindow para no tener que llamarla desde la clase Myform, sino desde la misma clase, pero me sigue quedando la duda de como podría ser, pues no siempre se puede poner de un lado al otro, xD
gracias
si gustas hechale un vistazo a este code http://underc0de.org/foro/python/(pyqt4)-css-extractor/ ahí también uso dos clases y threading para conectar todo (si quieres usar la barra de progreso necesitarás usar el threading)
Saludos!
humm si se ve muy bien el código, yo estaba utilzando el módulo threading.Thread pero de las librerías de python, no sabía que QtCore tubiese su Thread, muchas gracias lo miraré.. :D