He class Ui_MainWindow(object) que crea una ventana con una barra de progreso y class OtherClass(object) que contiene el método en el que la variable int local incrementos en el ciclo.

Cómo conectar variable local de cambio de valor a los progres de la barra de cambio de valor?

mainGUI.py

import sys
from PyQt4.uic.Compiler.qtproxies import QtGui
from PyQt4 import QtGui
from Ui_MainWindow import Ui_MainWindow

def main():

    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())



if __name__ == '__main__':
    main()

Ui_MainWindow.py

from PyQt4 import QtCore, QtGui
from MainGui.OtherClass import OtherClass
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_MainWindow(object):
def myButtonSlot(self):
objVar=OtherClass()
objVar.method()
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(389, 332)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.myButtonSlot)
self.verticalLayout.addWidget(self.pushButton)
self.progressBar = QtGui.QProgressBar(self.centralwidget) 
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.verticalLayout.addWidget(self.progressBar)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 389, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))  

OtherClass.py

class OtherClass(object):  
def method(self):
for i in range(100): # i want to connect variable i to progress bar value
print i 
for j in range(100500):
pass
Por favor, mostrar el código que tiene hasta el momento.

OriginalEl autor Sashko Lykhenko | 2014-01-01

3 Comentarios

  1. 7

    Usted necesita para re-organizar el código un poco.

    En primer lugar, usted debe nunca modificar el código en el módulo de interfaz de usuario generados por pyuic. En cambio, la importación en su módulo principal y aplicar el conjunto de la lógica de la aplicación no.

    En segundo lugar, debe crear una principal en la ventana de la clase en el módulo principal, y hacer toda la instalación en el interior de su __init__ método.

    Una manera de resolver su problema de conexión de la variable de bucle a la barra de progreso, es hacer OtherClass una subclase de QObject y emiten una señal personalizada:

    from PyQt4 import QtCore
    class OtherClass(QtCore.QObject):
    valueUpdated = QtCore.pyqtSignal(int)
    def method(self):
    # i want to connect variable i to progress bar value
    for i in range(100):
    print i
    self.valueUpdated.emit(i)
    for j in range(100500):
    pass

    Con que en el lugar, a continuación, mover la configuración de pushButton y su ranura para «mainGUI.py» y re-generar «Ui_MainWindow.py» con pyuic. Una ranura entonces sería añadido para manejar la costumbre valueChanged de la señal, que sería actualización de la barra de progreso y también de procesos pendientes de eventos GUI.

    Así «mainGUI.py» parecería algo como esto:

    import sys
    from PyQt4 import QtGui
    from Ui_MainWindow import Ui_MainWindow
    from OtherClass import OtherClass
    class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
    QtGui.QMainWindow.__init__(self)
    self.setupUi(self)
    self.pushButton.clicked.connect(self.myButtonSlot)
    self.otherclass = OtherClass(self)
    self.otherclass.valueUpdated.connect(self.handleValueUpdated)
    def myButtonSlot(self):
    self.otherclass.method()
    def handleValueUpdated(self, value):
    self.progressBar.setValue(value)
    QtGui.qApp.processEvents()
    def main():
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
    if __name__ == '__main__':
    main()

    OriginalEl autor ekhumoro

  2. 3

    El siguiente post tiene una versión que se incrementa la barra de progreso en un 10% cada vez que pulse el botón. Y una versión que utiliza un temporizador para el incremento de la barra de progreso. (Yo estoy en el proceso de aprendizaje de este mismo)

    En Qt Designer, agregar una barra de progreso y un botón. Haga clic en » Editar Señales/Slots, arrastre una línea desde el botón a en algún lugar de la ventana y cuando el botón es ‘presiona()’ añadir una ranura(o señal??) se llama ‘button_pressed()’ (use el botón + para hacer esto). Cuando haya hecho esto, el ACEPTAR botón es de color gris – seleccione la ranura de hecho, y pulse OK.

    Guardar el archivo como ui_MainWindow.interfaz de usuario (nota de las capitales de cuidado).
    Convertir a un archivo py utilizando el archivo de proceso por lotes >

    pyuic4 -x ui_MainWindow.ui -o ui_MainWindow.py

    Este archivo debe ser algo como….(no es necesario editar este).

    from PyQt4 import QtCore, QtGui
    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):
    MainWindow.setObjectName(_fromUtf8("MainWindow"))
    MainWindow.resize(800, 600)
    self.centralwidget = QtGui.QWidget(MainWindow)
    self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
    self.progressBar = QtGui.QProgressBar(self.centralwidget)
    self.progressBar.setGeometry(QtCore.QRect(110, 90, 118, 23))
    self.progressBar.setProperty("value", 24)
    self.progressBar.setObjectName(_fromUtf8("progressBar"))
    self.pushButton = QtGui.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(120, 200, 75, 23))
    self.pushButton.setObjectName(_fromUtf8("pushButton"))
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtGui.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
    self.menubar.setObjectName(_fromUtf8("menubar"))
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtGui.QStatusBar(MainWindow)
    self.statusbar.setObjectName(_fromUtf8("statusbar"))
    MainWindow.setStatusBar(self.statusbar)
    self.retranslateUi(MainWindow)
    QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("pressed()")), MainWindow.button_pressed)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
    self.pushButton.setText(_translate("MainWindow", "PushButton", None))
    if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

    Crear un ‘program.py’ archivo. Este es el archivo que se va a ejecutar…

    import sys
    from PyQt4 import QtGui
    #from PyQt5 import QtCore, QtGui, QtWidgets #works for pyqt5
    from mainWindow import MainWindow
    def main():
    #app = QtWidgets.QApplication (sys.argv) #works for pyqt5
    app = QtGui.QApplication (sys.argv) #works for pyqt4
    m = MainWindow ()
    m.show ()
    sys.exit (app.exec_ () )
    if __name__ == '__main__':
    main ()

    Ahora esto es donde las cosas buenas que sucede cuando usted subclase de la ventana principal. Llamar a este archivo «mainWindow.py’. Cuidado con las capitalizaciones.

    from PyQt4 import QtCore, QtGui
    from ui_MainWindow import Ui_MainWindow #note the capitalization
    class MainWindow (QtGui.QMainWindow):
    def __init__ (self, parent = None):
    super (MainWindow, self).__init__ ()
    self.ui = Ui_MainWindow ()
    self.ui.setupUi (self)
    #------------do your custom stuff from here on-----------
    self.progress = 0 #Start value of progress bar
    self.ui.progressBar.setValue(self.progress)
    def button_pressed(self):
    print('button pressed')
    self.ui.statusbar.showMessage(str(self.progress)) #this is at bottom left of window. Discovered this accidentially when doing this!
    self.ui.progressBar.setValue(self.progress)
    self.progress+=10

    Hay un buen tutorial aquí que he usado para crear una alternativa ‘mainWindow.py» que utiliza un temporizador para incrementar la barra de progreso. No bloquee el código con un bucle de usar el modo de suspensión o haciendo un uso intensivo de la CPU bucle. No entiendo subprocesamiento múltiple, múltiples opciones de procesador sin embargo, para comentar sobre el uso de estos.

    #from PyQt5 import QtCore, QtGui, QtWidgets #works for PyQt5
    from PyQt4 import QtCore, QtGui
    from ui_MainWindow import Ui_MainWindow #note the capitalization
    class MainWindow (QtGui.QMainWindow):
    def __init__ (self, parent = None):
    super (MainWindow, self).__init__ ()
    self.ui = Ui_MainWindow () #same name as appears in mainWindowUi.py
    self.ui.setupUi (self)
    self.progress = 0 #Start value of progress bar
    self.ui.progressBar.setValue(self.progress)
    self.timer = QtCore.QBasicTimer()
    def button_pressed(self):
    self.timerEvent(64) #this needs an argument to work but I'm not sure what is is yet so I just put in some random number
    def timerEvent(self, e):
    self.ui.progressBar.setValue(self.progress)
    if self.progress >=100:
    self.timer.stop()
    else:
    if self.timer.isActive():
    pass
    else:
    self.timer.start(10,self) #10 milliseconds
    self.progress+=1

    OriginalEl autor Ninga

Dejar respuesta

Please enter your comment!
Please enter your name here