Seite 1 von 1

Fortschritts-Anzeige klemmt

Verfasst: Sonntag 12. November 2017, 22:33
von 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

Re: Fortschritts-Anzeige klemmt

Verfasst: Sonntag 12. November 2017, 23:10
von Sirius3
@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.

Re: Fortschritts-Anzeige klemmt

Verfasst: Sonntag 12. November 2017, 23:44
von 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

Re: Fortschritts-Anzeige klemmt

Verfasst: Montag 13. November 2017, 09:14
von noisefloor
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

Re: Fortschritts-Anzeige klemmt

Verfasst: Montag 13. November 2017, 09:40
von sebastian0202
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_())

Re: Fortschritts-Anzeige klemmt

Verfasst: Montag 13. November 2017, 15:21
von 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...