Seite 1 von 1
Anfänger sucht Fehler in Programm
Verfasst: Montag 21. Mai 2018, 19:16
von Ghostwriter
Also, ich bin ein KOMPLETTER Anfänger und habe gerade meinen ersten eigenen "Code" geschrieben.Das Problem ist dass er nicht funktioniert. Ich habe schon versucht irgendwo im Internet die Antwort zu finden, aber da ich nicht einmal den Fehler kenne, gab dies auch kein Ergebnis.
Hier mal der Code: Er sollte automatisch(wenn das Programm läuft) um 21 Uhr den Computer abschalten.
Code: Alles auswählen
from tkinter import *
from time import *
from os import *
h = asctime()
b= ("21:00:00")
while True:
if b in h:
shutdown= True
continue
if b not in h:
shutdown= False
while shutdown == True:
window=Tk()
txt=Text(window, width=70, height=3)
txt.insert(END,"Der Computer wird nun heruntergefahren,weil es schon 21:00 ist")
txt.pack()
os.system("shutdown -s -t 30")
Mein Problem ist: Die 1. Schleife sucht zwar ob ' b in h' ist, aber 'shutdown' ist immer '=False' , selbst wenn 'print(asctime()) ' die genau gleiche Uhrzeit wie 'b' angab, wurde 'shutdown' nicht auf 'True' gesetzt, sondern blieb immer 'False' .
Ich hoffe es ist klar was ich meine , hoffe auf rasche Antworten und bedanke mich schon im Vorhinein für diese!
Ghostwriter
Re: Anfänger sucht Fehler in Programm
Verfasst: Montag 21. Mai 2018, 19:45
von sls
Du hast eine Endlosschleife gebaut. `shutdown` wird nahezu immer False sein, da `h` ein einziges Mal im gezeigten Programmablauf deklariert wird, sprich der Wert von `h` wird nie verändert. Was du aber möchtest ist genau das. `h` soll aktualisiert werden, damit ein Vergleich mit der Shutdown-time getroffen werden kann.
*-Importe sollten vermieden werden, da sie ein Programm unübersichtlich gestalten, aufblähen oder zu Namenskonflikten kommen können. Variablennamen wie `h` und `b` sind schlecht, sie sollten aussagekräftig sein was eine Variable tut bzw. wofür sie gut ist.
Den Zauber mit while-true-if-continue kannst du dir sparen. Definiere eine Funktion zum Herunterfahren, schreibe eine Shutdown-Funktion und wenn bspw. current_time in shutdown_time ist, wird die shutdown-Funktion aufgerufen. Ich würde mir auch überlegen, ob es eine gute Idee ist, den `in`-Operator für den Vergleich der Uhrzeiten zu Verwenden.
Re: Anfänger sucht Fehler in Programm
Verfasst: Montag 21. Mai 2018, 19:46
von ThomasL
Hi,
durch continue wird die Schleife nicht verlassen wird, das macht break
aber du fragst nicht in der Schleife nach der aktuellen Zeit, sondern nur einmal vorher
ich würde auf "21:00:0" testen, so das mehr Zeit ist für die Erkennung und die Schleife umformulieren, z.B.:
Code: Alles auswählen
while "21:00:0" not in asctime():
pass
# hier gehts weiter, PC runterfahren
Re: Anfänger sucht Fehler in Programm
Verfasst: Montag 21. Mai 2018, 19:52
von Sirius3
Zu dem was sls schon schreibt, `asctime` liefert einen String der von der aktuellen Spracheinstellung abhängt, etwas definierteres mit Datetime und format wäre robuster. Busy-Loops heizen eigentlich nur Deine Wohnung. Die zweite while-Schleife wird nicht gebraucht, weil wenn die erste Schleife funktionieren würde, dann wäre zu dem Zeitpunkt `shutdown` immer True.
`os.system` sollte man nicht mehr verwenden, dafür gibt es subprocess.call.
Re: Anfänger sucht Fehler in Programm
Verfasst: Dienstag 22. Mai 2018, 10:48
von kbr
Hier eine einfache Vorlage, auf der Du aufbauen kannst. Alle Aufrufe findest Du in der Standard-Library zum nachschlagen:
Code: Alles auswählen
import datetime
import time
shutdown_hour = 21
update_interval = 10 # time in seconds
shutdown_time = datetime.datetime.combine(datetime.date.today(), datetime.time(hour=shutdown_hour))
while datetime.datetime.now() < shutdown_time:
time.sleep(update_interval)
# your shutdown code here ...
Re: Anfänger sucht Fehler in Programm
Verfasst: Dienstag 22. Mai 2018, 15:27
von Ghostwriter
Dankeschön, dass hat schon mal geholfen!
Aber ich blicke leide nicht durch die ganzen subprocess Commands durch!
Ich hab auch schon im Internet Tutortials gesehen , verstehe es aber immer noch nicht!
Kann wer versuchen mir dass zu erklären oder mir den Code schreiben mit dem man in der Windows- Console den shutdown-command eingeben kann ?
Danke im Vorhinein!
Re: Anfänger sucht Fehler in Programm
Verfasst: Dienstag 22. Mai 2018, 15:43
von kbr
Es reicht, wenn Du Dir subprocess.run anschaust.
Ghostwriter hat geschrieben: Dienstag 22. Mai 2018, 15:27
... oder mir den Code schreiben mit dem man ...
Du bist der Ghostwriter ...

Re: Anfänger sucht Fehler in Programm
Verfasst: Mittwoch 13. Juni 2018, 20:11
von Ghostwriter
Danke für die ganze Hilfe!=)
Sorry dass ich so lange nichts mehr geschrieben habe,ich habe dieses Projekt mal kurz "auf Eis gelegt".
Hab mir heute nochmal subprocess.call angeschaut und habs endlich kapiert! Den Code habe ich noch nicht ausgetestet, aber er sollte funktionieren.XD
Hier der fertige Code:
Code: Alles auswählen
import datetime
import time
import subprocess
shutdown_hour =21
update_interval = 10 # time in seconds
shutdown_time = datetime.datetime.combine(datetime.date.today(), datetime.time(hour=shutdown_hour))
while datetime.datetime.now() < shutdown_time:
time.sleep(update_interval)
if datetime.datetime.now() == shutdown_time:
print("Shutdown erfolgreich!")
subprocess.call("shutdown -s -t 60")
Ich werde ihn dann morgen testen.
Re: Anfänger sucht Fehler in Programm
Verfasst: Mittwoch 13. Juni 2018, 21:24
von /me
Ghostwriter hat geschrieben: Mittwoch 13. Juni 2018, 20:11
Code: Alles auswählen
[...]
while datetime.datetime.now() < shutdown_time:
time.sleep(update_interval)
if datetime.datetime.now() == shutdown_time:
print("Shutdown erfolgreich!")
subprocess.call("shutdown -s -t 60")
Wozu soll jetzt die if-Abfrage gut sein? Überleg bitte mal unter welcher Bedingung sie zutrifft. Berücksichtige dabei, was du mit update_interval machst.
Re: Anfänger sucht Fehler in Programm
Verfasst: Mittwoch 13. Juni 2018, 21:37
von __blackjack__
Ist ganz schön optimistisch *vor* dem Aufruf von ``shutdown`` schon auszugeben das der Shutdown erfolgreich war.

Re: Anfänger sucht Fehler in Programm
Verfasst: Mittwoch 13. Juni 2018, 22:31
von Sirius3
@__blackjack__: es ist optimistischer zu hoffen, dass der nicht getestete Code überhaupt funktioniert. Von daher wird die print-Zeile auch nie erreicht und die Ausgabe deshalb auch nicht falsch.
Re: Anfänger sucht Fehler in Programm
Verfasst: Donnerstag 14. Juni 2018, 19:43
von Ghostwriter
Ich habe fertig!
Der Code ist getestet und er funktioniert. Danke an alle die mitgeholfen haben .
=)
Hier nochmal der fertige Code :
Code: Alles auswählen
import datetime
import time
import subprocess
shutdown_hour = 21
shutdown_minute = 30
update_interval = 15 #seconds
shutdown_time = datetime.datetime.combine(datetime.date.today(), datetime.time(hour=shutdown_hour,minute= shutdown_minute))
while datetime.datetime.now() < shutdown_time:
time.sleep(update_interval)
if datetime.datetime.now() > shutdown_time:
subprocess.call("shutdown -s -t 60")
@/me
waren deine hHilfestellungen mit Absicht so vage , damit ich noch selber denken muss?
weil wenn nicht, wäre es gut, nächstes mal zu versuchen , etwas mehr und genauer zu schreiben.I´ch musste nämlich ein bisschen überlegen was genau du gemeint haben könntest! XD
*Thread closed*(?)
Re: Anfänger sucht Fehler in Programm
Verfasst: Donnerstag 14. Juni 2018, 20:27
von /me
Ghostwriter hat geschrieben: Donnerstag 14. Juni 2018, 19:43
@/me
waren deine hHilfestellungen mit Absicht so vage , damit ich noch selber denken muss?
Ja, waren sie. Und auch jetzt hast du zwar die Logik korrigiert, aber ein >= statt = wäre besser gewesen.
Den entscheidenden Punkt hast du aber übersehen. Du brauchst überhaupt keine if-Abfrage. Du kommst durch die vorher laufende while-Schleife ohnehin erst an die Stelle, wenn die Bedingung zutrifft.
Re: Anfänger sucht Fehler in Programm
Verfasst: Donnerstag 14. Juni 2018, 21:11
von __blackjack__
Die `if`-Abfrage ist auch immer noch potentiell gefährlich, denn wenn sich die Geschwindigkeit des Systems und die Aufflösung der Zeit ungünstig treffen, könnte die Bedingung so wie sie da steht trotzdem nicht zutreffen. Zugegeben unwahrscheinlich, aber dennoch möglich.
Re: Anfänger sucht Fehler in Programm
Verfasst: Freitag 15. Juni 2018, 18:11
von Ghostwriter
Danke für die tipps.
Hier noch einmal der korrigierte code:
Code: Alles auswählen
import datetime
import time
import subprocess
shutdown_hour = 21
shutdown_minute = 30
update_interval = 15 #seconds
shutdown_time = datetime.datetime.combine(datetime.date.today(), datetime.time(hour=shutdown_hour,minute= shutdown_minute))
while datetime.datetime.now() < shutdown_time:
time.sleep(update_interval)
subprocess.call("shutdown -s -t 60")
