[SOLUCIONADO] Funcion de boton PyQT4

Iniciado por fortil, Agosto 13, 2013, 05:07:36 PM

Tema anterior - Siguiente tema

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

Agosto 13, 2013, 05:07:36 PM Ultima modificación: Mayo 03, 2014, 11:46:05 AM por Flemon
Hola a todos(as)

resulta que tengo el siguiente cronómetro creado en QTDesing (sencillo)

Código: python

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_cronometro(object):
    def setupUi(self, cronometro):
        cronometro.setObjectName(_fromUtf8("cronometro"))
        cronometro.resize(288, 57)
        cronometro.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.gridLayoutWidget = QtGui.QWidget(cronometro)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 272, 41))
        self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
        self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setMargin(0)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.lcdNumber = QtGui.QLCDNumber(self.gridLayoutWidget)
        self.lcdNumber.setProperty("intValue", 0)
        self.lcdNumber.setObjectName(_fromUtf8("lcdNumber"))
        self.gridLayout.addWidget(self.lcdNumber, 0, 0, 1, 1)
        self.label = QtGui.QLabel(self.gridLayoutWidget)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 0, 1, 1, 1)
        self.toolButton = QtGui.QToolButton(self.gridLayoutWidget)
        self.toolButton.setObjectName(_fromUtf8("toolButton"))
        self.gridLayout.addWidget(self.toolButton, 0, 2, 1, 1)

        self.retranslateUi(cronometro)
        QtCore.QMetaObject.connectSlotsByName(cronometro)
        QtCore.QObject.connect(self.toolButton, QtCore.SIGNAL(_fromUtf8("clicked()")), cronometro.close)

    def retranslateUi(self, cronometro):
        cronometro.setWindowTitle(QtGui.QApplication.translate("cronometro", "Sesion", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("cronometro", "min restantes", None, QtGui.QApplication.UnicodeUTF8))
        self.toolButton.setText(QtGui.QApplication.translate("cronometro", "Cerrar Sesion", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    cronometro = QtGui.QWidget()
    ui = Ui_cronometro()
    ui.setupUi(cronometro)
    cronometro.show()
    sys.exit(app.exec_())



y lo llamo desde otro archivo que tiene mas cosas con una clase, la clase es esta (para no llenar esto de códigos)

Código: python

class Tiempo(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.timer = QtCore.QBasicTimer()
self.c = Ui_cronometro()
self.c.setupUi(self)
QtCore.QObject.connect(self.c.toolButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.quit1)
self.step = 90
self.h = int(self.step)/60
self.m = int(self.step)%60
self.codigo = None
self.doAction()

def doAction(self):
self.timer.start(60000,self)

def timerEvent(self, e):
vent = VentanaPrincipal()
if self.m > 0:
self.m -= 1
self.c.lcdNumber.display("%d:%d" % (self.h,self.m))
else:
self.m = 60
self.h -= 1
self.c.lcdNumber.display("%d:%d" % (self.h,self.m))

if self.step == 10:
vent.popup("Faltan "+str(self.step)+" minutos","le queda "+str(self.step)+"min de tiempo para estar en la sala, guarde todo ya que puede perder lo que ha hecho",1)
if self.step == 3:
vent.popup("Faltan "+str(self.step)+" minutos","le queda "+str(self.step)+"min de tiempo para estar en la sala, guarde todo ya que puede perder lo que ha hecho",3)
if self.step == 0:
self.quit1()
return

self.step = self.step - 1
#~ self.c.lcdNumber.display(self.step)

def quit1(self):
self.timer.stop()
........


Resulta que lo que quiero es que en el momento que se llame la función def quit1(self): esta actué igual que QtCore.QObject.connect(self.toolButton, QtCore.SIGNAL(_fromUtf8("clicked()")), cronometro.close) (como su función en el botón, pero sin tocarlo) he tratado de pasarle el mismo parámetro de cronometro.close en esa función pero no me va, también he tratado de pasar self.c.close e igual me sale error.

Lo que quiero es que este se cierre en el momento en que se acaba el tiempo.

MUCHAS GRACIAS

Para que funcione tenés que escribir self.close().

Voy a hacer una observación que espero que no te ofenda (ya que no es mi intención; sólo quiero darte una mano ;)).

La verdad es que me parece que estás haciendo algunas cosas sin entender bien porqué, lo cual lo atribuyo a que te falta un poco de práctica con POO, así como con PyQt.

Ojo! No es que vengas mal (todo lo contrario), pero creo que podrías mejorar si cambiaras algunas cosas:

    1. Tendrías que ordenar un poquito más tu código.

    2. Yo empezaría escribiendo programas "manualmente" y luego seguiría con QtDesigner (esto te lo digo para familiarizarte más rápido con PyQt).
        Creo que si empezás con QtDesigner de una, vas a delegar muchos líneas al programa y a dificultar el entendimiento del código (aquí te pasó con los Signals&Slots, por ej.).

Me parece estupendo que estés tan avanzado ya en python. Si le seguís metiendo garra como hasta ahora, cuando te quieras acordar ya vas a estar haciendo grandes proyectos con PyQt.

Espero que te sirvan mis recomendaciones y, por supuesto, si tenés alguna duda o necesitas ayuda con algo, no dudes en postear (intentando ayudarte yo tmb aprendo y practico).

Saludos!
WhiZ

P.D.: Hay unas cuantas cosas para corregir en el código, pero te dejo que vos lo investigues ;).


WhiZ, si tenes razón me falta bastante en PyQT y python, sino que es un hobby y cada vez que tengo tiempo (cuando estoy en vacaciones sobre todo) hago algo, ya que estudio Química.

LE estoy dando a PyQT4 porque antes trabajaba con Wx, y aunque es más fácil (porque ya lo tenía bastante recorrido) me quedaba corto en el entorno gráfico por falta de diseñadores, ahora me quedo corto en el código por falta de manuales o tutoriales completos (  :P ) del código de PyQT y también el diseñador (aunque se puede entender con los mismos de C++).


Ahora en lo del código, tenías razón también era solo poner eso, es que la verdad me falta un poco del entendimiento POO, antes ya estoy dándole a las clases y que hace rato no tocaba python.

gracias de nuevo men, si me puedes pasar unos tutos o manuales mas profundos sobre cosas de PyQT te lo agradecería bastante.

Ese es el problema que tenemos los que manejamos QT, la poca documentación, en especial para Python, pero hay webs que son de mucha ayuda: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta esa es la que uso cuando voy a desarrollar en QT (espero te sea de ayuda)

Saludos!







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

:D gracias men.

Por último, he estado averiguando como obtener el teclado en una pantalla para hacer alguna función y me ha servido, pero no he podido para evitar que cierren la ventana con el (ALT +F4) ¿de pronto saben algo al respecto?

gracias de nuevo

Intenta ignorando el evento con:

Código: python

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


Saludos!







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

A decir verdad, nunca leí ningún manual de pyqt. Creo que hay uno en inglés que es bastante completo pero no te lo podría asegurar.

Particularmente creo que lo mejor es lo que dice @11Sep. Yo uso mucho No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y riverbankcomputing. Realmente vas a encontrar todo acerca de cada clase y método que quieras utilizar.

Otra opción muy interesante es la que comencé a practicar hace un tiempo (cuando comencé a estudiar java y a usar eclipse). La verdad que desde que lo empecé a utilizar, eclipse me fascinó por varias razones, pero principalmente por 2.

La primera es que me parece 100% organizado. Permite distinguir rápidamente cuáles son las clases con las que estamos trabajando, así como sus métodos y atributos (extremadamente necesario en grandes/medianos proyectos principalmente).

La segunda razón es que permite explorar cada uno de los elementos que componen a una clase. Por ej., cuando pones "objeto." se carga un menú con todos los métodos y atributos de la clase, y no sólo eso, sino que además, al pasar el mouse por encima del método, aparece el código del mismo permitiendo deducir cómo funciona y cómo usarlo.

Probá con eso que vas a andar bien. Para encontrar rápido la documentación de las 2 páginas que te mencioné (pyqt.sourceforge.net y riverbankcomputing) usa google (escribis "pyqt qlabel", por ej., y vas a ver q aparece alguna de esas dos páginas con la documentación completa).

Saludos!
WhiZ


Lo que dice @WhiZ es verdad. PyQt lo aprendes a prueba y error y con mucha ayuda de Google.

Eclipse no me gusta, lo probé un par de veces (me dió muchos dolores de cabeza en Arch) y me pareció muy pesado, en especial para desarrollar en Python, es como matar moscas a cañonazos. Prefiero IDE's como Open Komodo o SPE. Pero esto ya es cuestión de gustos.

Saludos!







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