Anfänger sucht Fehler in Programm

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
Ghostwriter
User
Beiträge: 5
Registriert: Montag 21. Mai 2018, 18:35

Montag 21. Mai 2018, 19:16

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! :lol:
Ghostwriter
Ghostwriter, der :
Anfänger in Python , fest entschlossen besser zu werden!

Und weil's alle machen , hier noch ein Zitat: :P
"Gott erschuf die Katze, damit der Mensch einen TIger zum streicheln hat." - Victor Hugo
Benutzeravatar
sls
User
Beiträge: 167
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Tannhauser Gate

Montag 21. Mai 2018, 19:45

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.
With great processing power comes great responsibility.
Benutzeravatar
ThomasL
User
Beiträge: 244
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Montag 21. Mai 2018, 19:46

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
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
Sirius3
User
Beiträge: 8090
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 21. Mai 2018, 19:52

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.
Benutzeravatar
kbr
User
Beiträge: 895
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dienstag 22. Mai 2018, 10:48

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 ...
Ghostwriter
User
Beiträge: 5
Registriert: Montag 21. Mai 2018, 18:35

Dienstag 22. Mai 2018, 15:27

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!
Ghostwriter, der :
Anfänger in Python , fest entschlossen besser zu werden!

Und weil's alle machen , hier noch ein Zitat: :P
"Gott erschuf die Katze, damit der Mensch einen TIger zum streicheln hat." - Victor Hugo
Benutzeravatar
kbr
User
Beiträge: 895
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dienstag 22. Mai 2018, 15:43

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 ... :mrgreen:
Ghostwriter
User
Beiträge: 5
Registriert: Montag 21. Mai 2018, 18:35

Mittwoch 13. Juni 2018, 20:11

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.
Ghostwriter, der :
Anfänger in Python , fest entschlossen besser zu werden!

Und weil's alle machen , hier noch ein Zitat: :P
"Gott erschuf die Katze, damit der Mensch einen TIger zum streicheln hat." - Victor Hugo
Benutzeravatar
/me
User
Beiträge: 3192
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 13. Juni 2018, 21:24

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.
Benutzeravatar
__blackjack__
User
Beiträge: 757
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 13. Juni 2018, 21:37

Ist ganz schön optimistisch *vor* dem Aufruf von ``shutdown`` schon auszugeben das der Shutdown erfolgreich war. ;-)
Global warming is caused by the sun.
Sirius3
User
Beiträge: 8090
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 13. Juni 2018, 22:31

@__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.
Ghostwriter
User
Beiträge: 5
Registriert: Montag 21. Mai 2018, 18:35

Donnerstag 14. Juni 2018, 19:43

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*(?)
Ghostwriter, der :
Anfänger in Python , fest entschlossen besser zu werden!

Und weil's alle machen , hier noch ein Zitat: :P
"Gott erschuf die Katze, damit der Mensch einen TIger zum streicheln hat." - Victor Hugo
Benutzeravatar
/me
User
Beiträge: 3192
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Donnerstag 14. Juni 2018, 20:27

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.
Benutzeravatar
__blackjack__
User
Beiträge: 757
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 14. Juni 2018, 21:11

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.
Global warming is caused by the sun.
Ghostwriter
User
Beiträge: 5
Registriert: Montag 21. Mai 2018, 18:35

Freitag 15. Juni 2018, 18:11

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")
:P
Ghostwriter, der :
Anfänger in Python , fest entschlossen besser zu werden!

Und weil's alle machen , hier noch ein Zitat: :P
"Gott erschuf die Katze, damit der Mensch einen TIger zum streicheln hat." - Victor Hugo
Antworten