Progress bar in Qt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
qwert2
User
Beiträge: 18
Registriert: Donnerstag 8. Januar 2015, 12:53

Ich benutze den Progress Bar vom Qt-Desinger die xml lautet:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QProgressBar" name="progressBar">
    <property name="geometry">
     <rect>
      <x>147</x>
      <y>190</y>
      <width>491</width>
      <height>23</height>
     </rect>
    </property>
    <property name="value">
     <number>24</number>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>150</x>
      <y>130</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>Start</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
Wenn ich den Progress Bar aufrufe, dann stürtzt die Anwendung aus
unbekannten Gründen ab. Wenn ich die for Schleifen auf 100*100 und
bar.setMaximum(100*100), dann funktioniert es. Was genau passiert da und
was mache ich falsch? Mein Code:

Code: Alles auswählen


import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *              
import sys
import numpy as np
import time                    
            
def main():
    
    application = QApplication(sys.argv)  
    frame=loadUi('progress_bar.ui')
    
    bar=frame.progressBar
    bar.setMinimum(0)
    bar.setMaximum(1000*1000)
    
    def start():
        
        z=0
        i=0
        
        for xi in range(0,1000):
            for yi in range(0,1000):
                i+=1
                bar.setValue(i)
                z=xi+yi #some random processing task
        
        print 'done'
        
    frame.pushButton.clicked.connect(start)
    
    frame.show()
    sys.exit(application.exec_())
    
if __name__ == '__main__':
    main()

EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Was heißt "aus unbekannten Gründen"? Wie sehen die Fehlermeldung und der Traceback dazu aus?
Das Leben ist wie ein Tennisball.
qwert2
User
Beiträge: 18
Registriert: Donnerstag 8. Januar 2015, 12:53

Es kommt keine Fehlermeldung. Der Ladebalken bewegt sich ein wenig, bleibt stehen und das Programm stürzt ab.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Probier es mal damit

Code: Alles auswählen

    def start():
       
        z=0
        i=0
       
        for xi in range(0,1000):
            for yi in range(0,1000):
                i+=1
                bar.setValue(i)
                z=xi+yi #some random processing task
            QApplication.processEvents()
       
        print 'done'
a fool with a tool is still a fool, www.magben.de, YouTube
qwert2
User
Beiträge: 18
Registriert: Donnerstag 8. Januar 2015, 12:53

@MagBen: Ich werde es mal ausprobieren. Kannst du erklären, was die eingefügte Zeile bedeutet?

Ich finde es extrem merkwürdig, dass wenn ich das Programm in spyder ausführe, es nach wenigen Schritten abstürzt. Wenn es ich es mit der Windows Kommandozeile starte, stürzt es nur ab, wenn ich, während das Programm läuft, ein anderes Programm bedienen will. Würde mich mal interessieren, was für ein Spuck dahinter steckt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

qwert2 hat geschrieben:Kannst du erklären, was die eingefügte Zeile bedeutet?
QApplication.processEvents() bedeuted, dass die Qt-Event-Queue weiter abgearbeitet werden soll, d.h. z.B. wieder ein GUI-Update gamacht werden kann. Du rufst nämlich die start-Methode in der Event-Queue auf und wenn Du in der Event-Queue Zustandsänderungen in der GUI machst (bar.setValue(i) ), dann müssen diese nicht unbedingt sofort ausgeführt werden, sondern fügen einfach nur ein GUI-Update Event ans Ende der Event-Queue an, diese wird aber ohne QApplication.processEvents() während Deine start-Methode läuft nicht weiter abgearbeitet.

Unter Ubuntu 12.04 läuft Dein Code übrigens ohne Absturz und auch der Fortschrittsbalken bewegt sich auch ohne QApplication.processEvents() , das Fenster wird aber unschön ausgegraut (Anwendung ist beschäftigt).
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Guck Dir mal das Beispiel an: thread_progress.py

lunar und ich hatten das einst als Demo für genau solche Fragen entwickelt. Das ist natürlich noch Python 2.x und Qt 4.x. Ich vermute aber stark, dass das konzeptionell noch aktuell sein sollte.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
qwert2
User
Beiträge: 18
Registriert: Donnerstag 8. Januar 2015, 12:53

@Mag Ben: super das hat funktioniert

Danke an alle
Antworten