Aktivitäts-Anzeige

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

Donnerstag 18. Januar 2018, 17:10

Hallo Forum

Gegeben ist ein Programm, dass String-Operationen durchführt. Bei den größeren Verschlüsselungstiefen (ab 256-fach bzw. 512- fache Verschlüsselung), ist die Rechenleistung in der Performance schon deutlich spürbar. Während eine Seite in 3 Sekunden kodiert wird, dauern fünf Seiten schon 18 Seknden. Bei zehn Seiten 53 Sekunden usw...
Nun werden die wenigsten Leute seitenweise Nachrichten codieren. Hauptsächlich werden mit dem Programm kleine Nachrichten versendet. Dennoch...
Wenn nun doch jemand einen längeren Text codieren möchte, wäre es schön, wenn der Nutzer sieht, dass der Rechner noch lebt :lol:

Mein Programm hat einen TK-inter Teil unten und oben befindet sich das eigentliche Programm. Im oberen Teil sind diverse Routinen und Schleifen vorhanden. Jetzt dachte ich mir, dass ich in die einzelnen Schleifen und Routinen so eine Art "Anstoss-Marker" einbaue. Das heisst es müsste irgendwo eine Grafik oder ein Fenster mit Grafik offen sein, an das die "Anstoss-Marker", wenn sie den durchlaufen werden, ein Signal absetzen und so die Grafik irgend etwas macht (drehen,blinken...oder sonst was).

Ich habe so etwas noch nicht gemacht. Kann also sein, dass ich komplett daneben liege :lol:

Abstraktes Programm-Beispiel:

--------------------------------------------------------------
Programm-Code
/Programm-Code

Schleife
Anstoss-Marker
/Schleife

Programm-Code
/Programm-Code

Schleife
Anstoss-Marker
/Schleife

Programm-Code
/Programm-Code

Berechnungs-Routine
Anstoss-Marker
Berechnungs-Routine

Programm-Code
/Programm-Code

Berechnungs-Routine
Anstoss-Marker
/Berechnungs-Routine

TK-inter-Fenster
TK-inter-Fenster
--------------------------------------------------------------

Natürlich müsste die Aktivitäts-Anzeige vor den Operationen aufgerufen werden, und dann im Prozess als eine Art hoheitlicher Überwachungsmodus für die Anstoss-Marker verfügbar sein.

Einer eine Idee wie sowas aussehen könnte oder wie sowas gemacht wird?

Gruss jts
__deets__
User
Beiträge: 3673
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 18. Januar 2018, 17:19

Kommt jetzt ein bisschen darauf an, was du willst.

Wenn es nur um einen Spinner geht, weil du nicht weisst, wie lange es dauern wird, dann empfiehlt sich einfach die lange Berechnung in einen Thread auszulagern, und mittels der after-Methode tkinter in einem Timer dazu zu bringen, an irgendwas rumzudrehen.

Die after-Methode ist hier bis zum sprichwoertlichen erbrechen durchdekliniert im Tkinter-Forum. Ca jede zweite Frage bezieht sich letztlich darauf. Les dich da mal ein bisschen ein. Und ein Tipp: bau erstmal eine kleine, eigene Test-App, um damit rumzuspielen. Gerade bei Anfaengern geht der Versuch, Dinge in eine bestehende Anwendung einzubauen, oftmals schief - und dann versteht man nicht, woran es liegt.
jake-the-snake

Donnerstag 18. Januar 2018, 18:33

Abend Leute

Ja, ein Spinner würde genügen. Wobei mir jetzt eingefallen ist, dass ich ein leeres Code-Textfeld zur Verfügung haben, in das ich ja Ausgaben während des Prozessfortschrittes schreiben könnte.

Entweder so:

#
##
###
####

Aber wenn die Seite voll ist - und das wird sie - sieht man keinen Unterschied mehr, wenn alles mit Gatterzeichen gefüllt ist. Wie wäre denn so was:

|
/
-
|
/
-
\

Also eine drehende Linie?
Oder, wie auf der Seite unten, die System-Rückfrage-Box - aber diesmal als "Arbeitsanzeige/Spinner". Wäre sowas möglich, die Spinneranzeige auszulagern in ein solches Extrafenster, oder doch die Codetext-Feld-Box verwenden?
https://www.crypto-code-tool.com/software.html

Gruss jts
__deets__
User
Beiträge: 3673
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 18. Januar 2018, 19:06

Natuerlich ist das moeglich, ist ein Fenster wie jedes andere. Allerdings musst du da dein eigenes, neues TopLevel Fenster machen - das eingebaute Messagebox-Ding erlaubt dir keinen Zugriff auf seine Innereien so weit ich weiss.
jake-the-snake

Donnerstag 18. Januar 2018, 19:36

Abend _deets_

Alles klar. Ich werde deinen Rat beherzigen und mir ein externes Testprogramm basteln. Ein paar schleifen rein, um Aktivität zu produzieren, sowie ein Testfenster. Wenn da Probleme auftreten, melde ich mich wieder.

Die after-Methode werde ich mir auch ansehen. Wahrscheinlich muss dass Aktivitätsfenster periodisch "angestubst" werden. Deshalb vermutlich dein Timer-Hinweis.

Danke für die Tipps

Gruss jts
jake-the-snake

Montag 22. Januar 2018, 11:54

Hallo Forum

Als alternativer Ansatz:
Könnte man nicht periodisch Meldungen absetzen:

Code: Alles auswählen

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

from tkinter import *
from tkinter import messagebox

####################
# Hier ist Block A #
####################

def Schleife():
    ione = 0
    itwo = 0
    while ione <= 10: 
        ione = ione + 1
        while itwo <= 500:
            itwo = itwo +1
            print("Testausgabe")
            print(" Testausgabe")
            print("  Testausgabe")
            print(" Testausgabe")

       # hier soll ein Info-Fenster aufgehen "Prozess in Arbeit" oder "Bitte warten..."
       # dann nach ein paar Sekunden wieder schliessen... dann nächster Schleifendurchlauf...

print("Schlaufe beginnt unten im  Block B")

####################
# Hier ist Block B #
####################

# Fenster-Titel
root = Tk(className=" Hauptfenster")
root.resizable(FALSE,FALSE)
root.attributes("-topmost", 1)
root.wm_attributes('-type', 'splash')

def center_window(width=300, height=200):
    # get screen width and height
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()

    # calculate position x and y coordinates
    x = (screen_width/2) - (width/2)
    y = (screen_height/2) - (height/2)
    root.geometry('%dx%d+%d+%d' % (width, height, x, y))
    
center_window(800, 480)

# Titel Schrift ueber Programm-Fenster 
zeroLabel = Label(root, text=">> Hauptfenster mit Aktivität <<", font=("TimesNewRoman", 10), bg=('#999999'))
zeroLabel.place(x=305,y=28)

Schleife()

root.mainloop()
Also immer wenn die innere Schleife einmal durch ist, ein Fenster einblenden, kurz stehen lassen und wieder entfernen.
Dann hätte man so eine Art Blinkeffekt "Bitte warten..." :)

Gruss jts
Sirius3
User
Beiträge: 8580
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 22. Januar 2018, 13:21

@jake-the-snake: das ist ja genau das, was man nicht haben möchte. Man könnte dann ja auch das Fenster die ganze Zeit stehen lassen, und dann ist es halt eingefroren.

Dir hat man sicher auch schon gesagt, keine Sternchenimporte zu benutzen und Dich an die Namenskonvention zu halten.
jake-the-snake

Montag 22. Januar 2018, 14:36

Mahlzeit Forum
das ist ja genau das, was man nicht haben möchte.
Ich habe mir das nochmal überlegt...
Wenn du dir die 5 Knöpfe ansiehst, dann geht es im Prinzip um den roten "Verschlüsseln"-Knopf.

https://www.crypto-code-tool.com/software.html

Drückt man z. B. auf den Beenden-Knopf, erscheint die messagebox. Das gute daran ist, dass alle anderen Knöpfe solange gesperrt sind, bis im System-Rückfrage-Fenster eine Entscheidung gefällt wird (Ja/Nein). So sollte das auch bei einem Klick auf "Verschlüsseln" sein - also die Sperre, nicht die Knöpfe!

Wenn ich jetzt bei der nächsten Softwareversion die "Verschlüsseln"-Funktion auslagere (in einen anderen Thread) wäre die GUI ja wieder frei - und das darf nicht sein. Es darf keine andere Funktion möglich sein, bis das Ergebnis von "Verschlüsseln" vorliegt.

Also: Die eingefrorene GUI ist nicht das, was mich stört! Mich stört, dass während die GUI wartet, weil noch Rechenoperationen laufen, der Nutzer eventuell das Gefühl bekommen könnte, der Rechner sei "abgeschmiert". Deswegen ja meine Idee, von Zeit zu Zeit da was einzublenden, damit man sieht, das Programm arbeitet noch.

Ich hoffe ich konnte das verständlich ausführen. :)

Gruss jts
Sirius3
User
Beiträge: 8580
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 22. Januar 2018, 15:53

@jake-the-snake: das Einfrieren ist Dein Problem. Statt dessen solltest Du Deine Knöpfe einfach disablen und eine Wartemeldung ausgeben.
__deets__
User
Beiträge: 3673
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 22. Januar 2018, 17:06

@jake-the-snake: was wir als einfrieren bezeichen hat nichts mit moeglichen Nutzerinteraktionen zu tun. Auch ein Fortschrittsbalken friert ein, wenn die GUI nicht regelmaessig ihre Ereignisse bearbeiten darf.
Antworten