2016-11-04 1 views
-1

Ich bin neu in PyQt5 und ziemlich neu in Python. Ich versuche eine grafische Benutzeroberfläche mit PyQt5 in Python 3.5 zu erstellen, wo ich auf eine Schaltfläche klicke, um ein separates Fenster zu starten, in dem der Fortschrittsbalken bis zu 100 iteriert und dann das Fenster am Ende der Iteration schließt, um eine Nachricht "it" zu erzeugen hat funktioniert".Python 3.5, pyqt5 Fortschrittsbalken GUI im seperaten Fenster

Das Problem ist der Fortschrittsbalken erstellt wird, aber nicht aktualisiert und nach dem Erreichen des Endes zeigt es nicht die Nachricht, dass es funktioniert. Wenn ich versuche, es zu debuggen, stürzt es komplett ab, ohne zu warnen, warum. Ich weiß nicht, wie sonst, den Code zu debuggen

Mein Fortschritt Strichcode ist unten dargestellt:

from PyQt5 import QtCore, QtWidgets 
import sys 

class Ui_Form(object): 
def setupUi(self, Form): 
    Form.setObjectName("Form") 
    Form.resize(1075, 84) 
    self.progressBar = QtWidgets.QProgressBar(Form) 
    self.progressBar.setGeometry(QtCore.QRect(30, 30, 1000, 35)) 
    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
    sizePolicy.setHorizontalStretch(0) 
    sizePolicy.setVerticalStretch(0) 
    sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth()) 
    self.progressBar.setSizePolicy(sizePolicy) 
    self.progressBar.setMinimumSize(QtCore.QSize(1000, 35)) 
    self.progressBar.setMaximumSize(QtCore.QSize(1000, 35)) 
    self.progressBar.setProperty("value", 0) 
    self.progressBar.setObjectName("progressBar") 

    self.retranslateUi(Form) 
    QtCore.QMetaObject.connectSlotsByName(Form) 

def setValue(self, val): 
    self.progressBar.setProperty("value", val) 

def retranslateUi(self, Form): 
    _translate = QtCore.QCoreApplication.translate 
    Form.setWindowTitle(_translate("Form", "Progress bar")) 

Das Hauptprogramm ist unten angegeben

from PyQt5.QtWidgets import QApplication, QDialog, QWidget, QPushButton, QMessageBox 
import ProgressBar 
import sys 

class App(QWidget): 
def __init__(self): 
    super().__init__() 
    self.title = 'PyQt5 button - pythonspot.com' 
    self.left = 200 
    self.top = 200 
    self.width = 320 
    self.height = 200 
    self.initUI() 

def initUI(self): 
    self.setWindowTitle(self.title) 
    self.setGeometry(self.left, self.top, self.width, self.height) 

    button = QPushButton('PyQt5 button', self) 
    button.setToolTip('This is an example button') 
    button.move(100, 70) 
    button.clicked.connect(self.on_click) 

    self.show() 

def on_click(self): 
    print('PyQt5 button click') 

    app1 = QApplication(sys.argv) 
    window = QDialog() 
    ui = ProgressBar.Ui_Form() 
    ui.setupUi(window) 
    window.show() 

    for i in range(0, 100): 
     ui.setValue(((i + 1)/100) * 100) 

    app1.quit() 

    QMessageBox.information(self, "Message", "Data Loaded") 

if __name__ == '__main__': 
app = QApplication(sys.argv) 
ex = App() 
sys.exit(app.exec_()) 

Jede Hilfe wäre sehr dankbar.

Antwort

-2

Herausgefundene Lösung schließlich. 3 Probleme:

1) Sollte QApplication nur nennen, wenn in der Hauptanwendung eines nicht wieder 2) In QApplication.processEvents() an die forloop so den progressbar kontinuierlich 3) In window.close() nach der Aktualisierung Forloop so schließt es

+0

Können Sie Code anzeigen? – Rahul

1

Hier ist mein endgültiger Code. Ich habe versucht, einige gute Praktiken in die Verwendung von pyqt designer aufzunehmen und die erstellte Datei nicht direkt zu bearbeiten, sondern sie aus einer anderen Datei auszuführen und aufzurufen. Dies hat die Dinge viel einfacher gemacht, wenn ich die Dinge wie vorgeschlagen ändern wollte. Ich habe auch einen time.sleep (0.1) zum Code hinzugefügt, um es zu verlangsamen, also können Sie es sehen, dass es funktioniert. Ich hoffe es hilft.

ProgressBar_ui.py - Datei konvertiert erzeugt in Python von ProgressBar.ui

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'Base.ui' 
# 
# Created by: PyQt5 UI code generator 5.6 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_Form(object): 
    def setupUi(self, Form): 
    Form.setObjectName("Form") 
    Form.resize(1075, 84) 
    self.progressBar = QtWidgets.QProgressBar(Form) 
    self.progressBar.setGeometry(QtCore.QRect(30, 30, 1000, 35)) 
    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 
    sizePolicy.setHorizontalStretch(0) 
    sizePolicy.setVerticalStretch(0) 
    sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth()) 
    self.progressBar.setSizePolicy(sizePolicy) 
    self.progressBar.setMinimumSize(QtCore.QSize(1000, 35)) 
    self.progressBar.setMaximumSize(QtCore.QSize(1000, 35)) 
    self.progressBar.setProperty("value", 0) 
    self.progressBar.setObjectName("progressBar") 

    self.retranslateUi(Form) 
    QtCore.QMetaObject.connectSlotsByName(Form) 

def retranslateUi(self, Form): 
    _translate = QtCore.QCoreApplication.translate 
    Form.setWindowTitle(_translate("Form", "Progress bar")) 

ProgressBar.py - Calls ProgrssBar.ui

from PyQt5 import QtCore, QtGui, QtWidgets 
import sys 

from ProgressBar_ui import Ui_Form 

class ProgressBar(QtWidgets.QDialog, Ui_Form): 
    def __init__(self, desc = None, parent=None): 
     super(ProgressBar, self).__init__(parent) 
     self.setupUi(self) 
     self.show() 

     if desc != None: 
      self.setDescription(desc) 

    def setValue(self, val): # Sets value 
     self.progressBar.setProperty("value", val) 

    def setDescription(self, desc): # Sets Pbar window title 
     self.setWindowTitle(desc) 

def main(): 
    app = QtWidgets.QApplication(sys.argv)  # A new instance of QApplication 
    form = ProgressBar('pbar')      # We set the form to be our MainWindow (design) 
    app.exec_()         # and execute the app 

if __name__ == '__main__':      # if we're running file directly and not importing it 
    main()          # run the main function 

Main_program.py - Führen von hier

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox 
from ProgressBar import ProgressBar 
import sys, time 

class App(QWidget): 
    def __init__(self): 
     super().__init__() 
     self.title = 'PyQt5 button - pythonspot.com' 
     self.left = 200 
     self.top = 200 
     self.width = 320 
     self.height = 200 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     button = QPushButton('PyQt5 button', self) 
     button.setToolTip('This is an example button') 
     button.move(100, 70) 
     button.clicked.connect(self.on_click) 

     self.show() 

    def on_click(self): 
     pb = ProgressBar() 

     for i in range(0, 100): 
      time.sleep(0.05) 
      pb.setValue(((i + 1)/100) * 100) 
      QApplication.processEvents() 

     pb.close() 

     QMessageBox.information(self, "Message", "Data Loaded") 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    ex = App() 
    sys.exit(app.exec_()) 
Verwandte Themen