Brauche Hilfe find den fehler leider nicht. Ausgabe wechselt nicht!

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
Xasch
User
Beiträge: 5
Registriert: Sonntag 4. Juni 2017, 14:58

Guten Tag!
Ich beschäftige mich nun ca. eine Woche mit Python und möchte für den Jugendverband ein kleines Programm erstellen was eine Alarmierung simuliert.
Für den Anfang habe ich mir gedacht ein Label der den Inhalt wechselt sobald eine Einsatzuhrzeit hinterlegt ist. Doch soweit komme ich noch nicht mal, ich habe vorerst den einfachen print befehle gewählt bevor ich ein Schritt weiter gehe allerdings zeigt er Dauerhaft „Kein Einsatz“ an obwohl die Uhrzeit erreicht wurde wo er eigentlich „Einsatz“ ausgeben sollte.
Wenn ich das Skript starte um die Uhrzeit wo ein Einsatz hinterlegt wurde bleibt er allerdings auch bei der Ausgabe „Einsatz“.
Hier natürlich der Code =)

Code: Alles auswählen

import pygame
from tkinter import *
import _thread,time

# Alarm Datei
file = 'test.mp3'

# Einsatz Uhrzeit
einsatz1 = "14:50"
einsatz2 = "15:42"
einsatz3 = "15:53"
zeit1=time.strftime("%H:%M");

#Fenster Eigenschaften
root = Tk()
root.title("Einsatz 1.0")
root.minsize(width=500, height=500)

#Musik
#pygame.init()
#pygame.mixer.init()
#pygame.mixer.music.load(file)
#pygame.mixer.music.play()

#Abfrage Einsatz

def einsatz():
    while 1:
        if (zeit1 == einsatz1 or zeit1 == einsatz2 or zeit1 == einsatz3):
            print ("Einsatz")
        else:
            print ("Kein Einsatz!")
        time.sleep(10)# Alle 10 Sekunden Überprüfen
_thread.start_new(einsatz,())

    
#uhr
zeit=StringVar()
uhr=Label(root,textvariable=zeit,font=("Arial",20))
uhr.place (x=350,y=10)
def aktualisieren():
    while 1:
        zeit.set(time.strftime("%X"))
        time.sleep(1)
_thread.start_new(aktualisieren,())
root.mainloop()
Hat vielleicht jemand eine Idee was ich falsch mache ?
Achja ich benutze Python 3.6

schonmal danke für eure hilfe :D
Zuletzt geändert von Anonymous am Sonntag 4. Juni 2017, 15:12, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Xasch: Warum hast Du denn ein anderes Verhalten erwartet? Was haben denn `zeit1`, und `einsatz1` bis `einsatz3` für Werte in der Schleife? Lass Dir die Werte mal ausgeben.

Sonstige Anmerkungen:

Sternchen-Importe sind Böse™. Damit holst Du gerade bei `tkinter` eine ganze Menge Namen in den aktuellen Namensraum ohne zu wissen welche alle. Das wird schnell unübersichtlich wenn man nicht mehr weiss wo die Namen her kommen, ausserdem besteht die Gefahr von Namenskollisionen.

Der führende Unterstrich bei `_thread` sagt aus, dass dieses Modul nicht zur öffentlichen API gehört, also nicht für Dich zum benutzen gedacht ist. Für Threads gibt es das `threading`-Modul oder `concurrent.futures` für eine etwas abstraktere API. Allerdings sind Threads und GUI-Programmierung nicht so einfach, denn üblicherweise sind GUI-Rahmenwerke nicht so einfach „thread safe“, das heisst die GUI sollte man nur aus dem Thread verändern in dem auch die GUI-Hauptschleife läuft. Weshalb man üblicherweise über Queues komminiziert und die mit der `after()`-Methode auf Tk-Widgets regelmässig abfragt. Sofern man das Problem nicht sowieso schon mit `after()` erschlagen kann.

Das die Anzeige der Uhrzeit mit dem Thread so funktioniert, ist wohl eher Zufall.

Durchnummerieren von Namen ist üblicherweise ein Zeichen dafür das man keine Einzelnamen sondern eine Datenstruktur verwenden möchte. Oft ist das eine Liste.

Bei `zeit1` macht die Nummer im Namen so gar keinen Sinn.

Python hat einen Typ für Wahrheitswerte (`bool`) und die Werte `True` und `False`. Man sollte da nicht 1 und 0 für missbrauchen.

Um Bedingungen gehören keine sinnlosen Klammern. Und zwischen Funktionsname und öffnender Klammer für einen Funktionsaufruf gehört kein Leerzeichen.

`place()` sollte man nicht verwenden. Das ist sehr aufwändig und passt sich nicht den Einstellungen des Systems an.

Code auf Modulebene sollte nur Konstanten, Funktionen, und Klassen definieren. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Bei GUI-Programmierung kommst Du auf Dauer nicht wirklich um objektorientierte Programmierung herum.
Xasch
User
Beiträge: 5
Registriert: Sonntag 4. Juni 2017, 14:58

Danke für die schnelle Antwort allerdings haben die ganzen Infos mich jetzt Grad total erschlagen grade da ich wie eben schon erwähnt Grad mal 1 Woche mit python arbeite:/

Einsatz 1 bis 3 haben die Urzeiten hinterlegt wo ein einsatz stattfinden soll.

Das mit dem Sternchen Import versteh ich werde ich natürlich versuchen zu beheben.

Mein wissen ist bisher begrenzt und ich versuche mich mit Tutorials und Forum beiträgen dort zurecht zu finden.

Das _thread nicht mehr aktuell ist mir bewusst allerdings bei meinem wissen bisher die einzige Möglichkeit die ich zum Laufen bekommen habe :(

Ich Versuch gleich mal deinen kompletten Text irgendwie umzusetzen:x
BlackJack

Mal ohne Threads aber immer noch mit dem Fehler beim Vergleichen der Zeiten:

Code: Alles auswählen

import time
import tkinter as tk


def check_einsatz(widget, zeit, einsatz_zeiten):
    print('Einsatz' if zeit in einsatz_zeiten else 'Kein Einsatz!')
    widget.after(10000, check_einsatz, widget, zeit, einsatz_zeiten)


def update_clock(widget, variable):
    variable.set(time.strftime('%X'))
    widget.after(500, update_clock, widget, variable)


def main():
    root = tk.Tk()
    root.title('Einsatz 1.0')

    einsatz_zeiten = ['14:50', '15:42', '15:53']
    zeit = time.strftime('%H:%M')
    check_einsatz(root, zeit, einsatz_zeiten)

    time_variable = tk.StringVar()
    clock_label = tk.Label(root, textvariable=time_variable, font=('Arial', 20))
    clock_label.pack(padx=10, pady=10)
    update_clock(clock_label, time_variable)

    root.mainloop()


if __name__ == '__main__':
    main()
Xasch
User
Beiträge: 5
Registriert: Sonntag 4. Juni 2017, 14:58

danke schonmal für den Code von dir BlackJack =)
werde nun erstmal schauen wie du ihn aufgebaut hast und welche befehle du verwendet hast.
Schade das mit dem Zeitvergleichen noch nicht klappt =)
allerdings ein bisschen selber probieren soll ja auch noch drin sein =)
Xasch
User
Beiträge: 5
Registriert: Sonntag 4. Juni 2017, 14:58

guten Tag ich schon wieder =)

ich bin der meinung das ich den fehler gefunden habe allerdings leider noch keine lösung dafür finde.
Und zwar bin ich der meinund das die variable "zeit" nicht aktuallisiert wird.

Angenommen ich habe eine einsatz Zeit auf 12:00 gelegt und starte das programm um 11:59 ist in der variable die zeit 11:59 hinterlegt. sobald wir 12:00 uhr haben sollte die variable 12:00 hinterlegt bekommen dies ist allerdings leider nicht der fall sondern es bleibt bei 11:59 =/

vielleicht seh ich auch in moment den Wald vor lauter Bäumen nicht mehr um den fehler zu beheben =X

Gruß Xasch
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Xasch: an welcher Stelle weißt Du der Variable `zeit` die aktuelle Zeit zu? Wo müßtest Du dies tun, damit Du die Einsatzzeiten immer mit der aktuellen Zeit vergleichst?
Xasch
User
Beiträge: 5
Registriert: Sonntag 4. Juni 2017, 14:58

Danke Sirius *.* nun geht es verdammt manchmal muss man nur die richtigen fragen stellen um die Richtige antwort zu bekommen =) leider kommt man nicht immer selbst auf die fragen

Danke für die Hilfe
Ein glücklicher Xasch =)
Antworten