Fortschritts-Anzeige klemmt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jake-the-snake

Abend Forum

Ich habe mir eine "Fortschrittsanzeige" gebastelt, die anhand der verstreichenden Zeit auch zu laufen scheint. Aber im tkinter-Fenster wird nur der Schluss dieser Anzeige angezeigt.

Code: Alles auswählen

    # Rechte Fortschritt-Anzeige Status-Feld
    delay = 0.5
    displaycounter = 1
    if displaycounter == 1:
       time.sleep(delay)
       fwddisplay = "●○○○○○○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 2:
       time.sleep(delay)
       fwddisplay = "●●○○○○○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 3:
       time.sleep(delay)
       fwddisplay = "●●●○○○○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 4:
       time.sleep(delay)
       fwddisplay = "●●●●○○○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 5:
       time.sleep(delay)
       fwddisplay = "●●●●●○○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 6:
       time.sleep(delay)
       fwddisplay = "●●●●●●○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 7:
       time.sleep(delay)
       fwddisplay = "●●●●●●●○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 8:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 9:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 10:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 11:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 12:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 13:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 14:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 15:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●●○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 16:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●●●○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 17:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●●●●○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 18:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●●●●●○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 19:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●●●●●●○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 20:
       time.sleep(delay)
       fwddisplay = "●●●●●●●●●●●●●●●●●●●●"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
    if displaycounter == 21:
       time.sleep(delay) 
       fwddisplay = "○○○○○○○○○○○○○○○○○○○○"
       fourLabel = Label(root, text= fwddisplay , font=("TimesNewRoman", 15), width=36, anchor=("w"), fg="orange")
       fourLabel.place(x=428,y=345)
       displaycounter = displaycounter + 1
Ich erhalte also nur die Anzeige von Zeile 126 :(
Wie gesagt, von der Zeit her scheint es zu funktionieren, nur die Anzeige im tkinter-Fenster scheint die einzelnen Schritte nicht mit zu gehen?

Gruß jts
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@jake-the-snake: so funktionieren GUI-Programme nicht. Methoden dürfen nur kurz laufen, und gleich wieder in die mainloop zurückkehren, weil nur dort die Anzeige aktualisiert und auf Nutzereingaben gewartet werden. Auch sollte man nicht ständig Labels erzeugen und übereinander schieben, weil sie existieren alle und werden immer mitgezeichnet.
jake-the-snake

Abend Sirius3,

Ja, ich habe sowieso die if-Syntax vermasselt. Es muss if elif,elif usw... heißen.
Auch sollte man nicht ständig Labels erzeugen und übereinander schieben, weil sie existieren alle und werden immer mitgezeichnet.
Oha - ich dachte gleiches Label mit neuem Inhalt ersetzt vorheriges - ohje... :?

Gut, ich lasse das mit dieser Anzeigen-Spielerei. Das ist sowieso Luxus...
Trotzdem Danke für das Teilen deines Wissens :)

Gruss und Gute Nacht jts
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

da du ja noch aktiv in der Programmentwicklung bis nochmal explizit der Hinweis: _nie_ `time.sleep(X)` bei GUIs verwenden, weil es eben den Mainloop der GUI blockiert. D.h. die GUI ist in diesem Moment quasi "eingefroren".

Gleiches gilt auch für alle anderen Dinge, die länger Laufen (können), z.B. Operation mit dem Dateisystem. Diese sollte man dann in einen eigenen Thread / Prozess auslagern.

Gruß, noisefloor
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


so eine Fortschrittsanzeige ist gar nicht so schwer.
Für PyQt5 bekommt man ein gutes Tutorial von dieser Seite: http://zetcode.com/gui/pyqt5/widgets/
Ich habe von dort den Code genutzt und deine eigene Progressbar dazu programmiert (da wo Kommentare sind).

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This example shows a QProgressBar widget.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

from PyQt5.QtWidgets import (QWidget, QProgressBar, 
    QPushButton, QApplication, QLabel)
from PyQt5.QtCore import QBasicTimer
import sys

class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):      

        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)

        # Label Geometry / Standardtext
        self.lbl = QLabel(self)
        self.lbl.setGeometry(30, 20, 200, 25)
        self.lbl.setText(20 * '○')

        self.btn = QPushButton('Start', self)
        self.btn.move(40, 80)
        self.btn.clicked.connect(self.doAction)

        self.timer = QBasicTimer()
        self.step = 0
        
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()
        
        
    def timerEvent(self, e):
      
        if self.step >= 100:
            
            self.timer.stop()
            self.btn.setText('Finished')
            return
            
        self.step = self.step + 1
        self.pbar.setValue(self.step)
        
        # Label Progress
        self.lbl.setText(self.update_progress())
    
    def update_progress(self):

        # anhand des Fortschritts den Text erstellen
        number = int(self.step / 5)
        lbl_text = number * '●'
        return lbl_text.ljust(20, '○')

    def doAction(self):
      
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(50, self)
            self.btn.setText('Stop')
            
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
jake-the-snake

Hallo Forum


@noisefloor
Danke für den "time.sleep(delay)"-Hinweis. Wusste nicht, dass der das ganze system warten lässt.

@sebastian0202
Werde ich ausprobieren, wenn ich mir der Struktur des bisherigen Programms sicher bin -> Sollte in einen anderen Thread,
damit er bei entsprechender Suche auch gefunden wird. Wenn dort alles ok ist, mache ich hier weiter...
Antworten