[SOLCIONADO] Clases y Herencia

Iniciado por fortil, Enero 02, 2013, 09:38:59 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 02, 2013, 09:38:59 PM Ultima modificación: Septiembre 26, 2014, 09:28:49 PM por Expermicid
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):
Código: python

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:
Código: php
    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
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Enero 02, 2013, 10:12:49 PM #2 Ultima modificación: Enero 02, 2013, 10:19:42 PM por fortil
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?

Código: python

# -*- 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:
Código: python
    def barra(self, param):
        self.progressBar.setValue(param)


y la llamas así:

Código: python
self.ui2.barra(percent)


Por cierto, si no usas threading dudo te funcione

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta ahí también uso dos clases y threading para conectar todo (si quieres usar la barra de progreso necesitarás usar el threading)

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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