Python: time.sleep


ruNN0r

Erfahrenes Mitglied
hi,
ich bin relativ neu in der Python Programmierung und habe mich schonmal bis zu den grafischen Benutzeroberflächen vorgearbeitet.
ich möchte nun einen Prozessen "Pausieren" und nach *5*sec weiterlaufen lassen.

Beispiel:
PHP:
print("a")
time.sleep(5)
print("b")
Alles super!
Jedoch unter der grafischen Benutzeroberfläche klappt das nicht so wie ich möchte:
PHP:
#Ausschnittbeginn
label_pumpe1 ["text"] = txt_wasserpumpe, "Ein"
label6 ["text"] = "Wasserpumpe Aktiviert. Heizungspumpe startet in 30 sec."
time.sleep(30)
label_pumpe2 ["text"] = txt_heizpumpe, "Ein"
#Ausschnittende
Jedoch das klappt nicht ;) Wenn ich auf meinen Startbutton Klicke Arbeitet der zwar, wartet die 30sec ab, dann erst schreibt er alles auf einmal rein. Nicht so wie ich will. Erst soll label_pumpe1 und label6 geschrieben werden dann 30sec Pause dann label_pumpe2

Vielen Dank im Vorraus.
 

Raubkopierer

Erfahrenes Mitglied
Welches Toolkit benutzt du für die grafische Nutzerobrerfläche?
Diese verwenden meist eine eigene Mainloop, die das Zeichnen des Interfaces verwaltet und abstimmt. Das heißt Sachen wie wann das Display neu gezeichnet werden muss etc. Wenn du nun in einer Methode sleep benutzt schläft das komplette Programm und somit auch das Interface. Das bedeutet keine Redraws, keine Nutzereingaben etc. . Für den Nutzer sieht es so aus als hätte die Anwendung sich aufgehangen. Daher stellen die meisten Toolkits in ihren Mainloops eigene Timer bereit die man für solche Aufgaben nutzen sollte um sleep zu vermeiden.
 

ruNN0r

Erfahrenes Mitglied
Super. Besten Dank!
Also ich habe mich mal weiter schlau gemacht auf deine Bemerkung und es hin bekommen.
Zu deiner Frage: Tkinter
Ist momentan alles für die Schule daher nur die Standart imports ;)

Meine Lösung:
vor das sleep -> main.update_idletasks()
wobei "main" -> "main = tkinter.Tk()"

Also so:
PHP:
import time
main = tkinter.Tk()
main.update_idletasks()
sleep(5)
Wenn es euch nicht stört habe ich ncoh weitere Fragen ;)

Weiteres Problem ich habe die Funktion test() und brennerset() nun will ich in test() brennerset() ausführen. Das geht aber nicht.
Hier die Brennerset():
PHP:
def brennerset():
    if pumpe_wasser_on==1 or pumpe_heiz_on==1:
        brenner=int(1)#Brenner einschalten
        label_brenner ["text"] = txt_brenner, "Ein"#Visuelle Ausgabe
    else:
        brenner=int(0)
        label_brenner ["text"] = txt_brenner, "Aus"
    return brenner
Also der Text wird nicht geschrieben! Ich führe die ganz normal mit "brennerset()" aus. Und der Wert wird auch nicht ausgegeben... wenn ich "print(brenner)" eingebe sagt der mir nen fehler "local variable 'brenner' ****".

Nächste Frage wenn ich z.B. etwas ausgebe:
label_pumpe1 = tkinter.Label(main, text=txt_wasserpumpe + "Aus")
label_pumpe1.pack()
und das in der Funktion ändere mit:
label_pumpe1 ["text"] = txt_wasserpumpe, "Ein"

wird mir das was in der txt_wasserpumpe immer in { } geschrieben? was mache ich falsch? also typen habe ich festgelegt vorher (string)

Vielen Dank euch allen
 

ruNN0r

Erfahrenes Mitglied
ok da mir scheinbar keiner helfen kann gebe ich das gesamte Programm mal weiter. Evtl. hilft das bei der Problemlösung
 

Anhänge

deepthroat

Erfahrenes Mitglied
Hi.
Weiteres Problem ich habe die Funktion test() und brennerset() nun will ich in test() brennerset() ausführen. Das geht aber nicht.
Hier die Brennerset():
PHP:
def brennerset():
    if pumpe_wasser_on==1 or pumpe_heiz_on==1:
        brenner=int(1)#Brenner einschalten
        label_brenner ["text"] = txt_brenner, "Ein"#Visuelle Ausgabe
    else:
        brenner=int(0)
        label_brenner ["text"] = txt_brenner, "Aus"
    return brenner
Also der Text wird nicht geschrieben! Ich führe die ganz normal mit "brennerset()" aus. Und der Wert wird auch nicht ausgegeben... wenn ich "print(brenner)" eingebe sagt der mir nen fehler "local variable 'brenner' ****".
Bitte kopiere die vollständige Fehlermeldung. Du verwendest vermutlich die lokale Variable "brenner" bevor dieser ein Wert zugewiesen wurde.
Nächste Frage wenn ich z.B. etwas ausgebe:
label_pumpe1 = tkinter.Label(main, text=txt_wasserpumpe + "Aus")
label_pumpe1.pack()
und das in der Funktion ändere mit:
label_pumpe1 ["text"] = txt_wasserpumpe, "Ein"

wird mir das was in der txt_wasserpumpe immer in { } geschrieben? was mache ich falsch? also typen habe ich festgelegt vorher (string)
Zuerst einmal, in Python mußt du keine Typen festlegen. Man kann es auch gar nicht, da sich Variablen nicht typisieren lassen. Du führst jedesmal eine (unnötige) explizite Umwandlung durch:
Python:
x = str("abc") # "abc" ist bereits ein string

x = "abc" # äquivalent

a = int(0)  # 0 ist schon ein Integer
a = 0 # genau das gleiche
Dann ist das Komma nicht der Konkatenierungsoperator für Strings. Du weist den Labeln immer Tupel zu:
Python:
label_pump1['text'] = txt_wasserpumpe, "Ein"

label_pump1['text'] = (txt_wasserpumpe, "Ein") # äquivalent

# richtig:
label_pump1['text'] = txt_wasserpumpe + "Ein"
Gruß
 

ruNN0r

Erfahrenes Mitglied
super. Also die {} bin ich los. Den Fehler habe ich selber gefunden. mit den + habe ich schon probiert aber habe die an einer anderen stelle vergessen somit passte das wieder nicht. Jut das ist behoben!

Nun noch die Funktion Brenner:
Also die Fehlermeldung Taucht nur auf wenn ich unter das brennerset() noch print(brenner) setze.

Screen der Fehlermeldung liegt bei und das aktuelle Programm habe ich auch hochgeladen.

Die Variable "brenner" hat für mich auch keinen vorrang. Sondern eher der Text der ausgegeben werden soll in der Funktion.
Die Variable "brenner" ist nur da wenn ich das Programm noch weiter abändern soll für den Lehrer. Jedoch wüsste ich schon gerne wo der fehler liegt ;)

Besten Dank erstmal
 

Anhänge

deepthroat

Erfahrenes Mitglied
Nun noch die Funktion Brenner:
Also die Fehlermeldung Taucht nur auf wenn ich unter das brennerset() noch print(brenner) setze.
Die Variable "brenner" gibt es nur lokal in der Funktion brennerset(). D.h. in der Funktion test() ist die Variable natürlich nicht bekannt.
Python:
def test():
  # ...
  brenner = brennerset() # Zeile 65
  print brenner
Screen der Fehlermeldung liegt bei und das aktuelle Programm habe ich auch hochgeladen.
Du kannst auch einfach den Text aus der Konsole kopieren - das geht doch viel schneller als einen Screenshot zu machen, zu speichern und dann hier anzuhängen. Ganz abgesehen vom Speicherbedarf auf dem Server.

Gruß
 

ruNN0r

Erfahrenes Mitglied
Super. Besten Dank!
Habe die letzten kleinen Probleme selber noch gelöst!

Man schreibt sich bestimmt wieder ;) Danke
 

Neue Beiträge