Python Programm kann nicht abgebrochen werden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich habe eine kleines Programm zusammenkopiert und ergänzt um auf meinem 1,8"sainsmart-Display eine Ausgabe der CU-Temperatur zu erzeugen. Damit will ich eigentlich "pygame" ausprobieren.
    Das Programm läuft und damit ist fast alles gut. Ich starte es von der Konsole aus.
    Aber ich kann das Programm nicht abbrechen. Auf CTRL+C reagiert es nicht.

    Mein Hardware-Aufbau sieht wie folgt aus: RaspberryPi B+ Monitor an HDMI und Display über SPI angeschlossen.

    Ich habe noch einen zweiten Test durchgeführt. Nachdem ich den Pi neu gestartet habe habe ich die GUI mit "startx" gestartet und dort ein Terminal geöffnet. In diesem habe ich dann das Programm gestartet. Dabei ist der Monitor dunkel geworden und das Programm lief auf dem Display. CRTL+C zeigt weider keine Reaktion.

    Hier der Programmcode:

    Wo kommt der Fehler her. Ich habe keine Idee mehr.

    Gruß Andreas

  • Ohne mir das Script genauer angeguckt zu haben:

    Ändere diese Zeilen:

    Spoiler anzeigen

    [code=php]
    def main():
    global screen

    # Initialisieren aller Pygame-Module und
    # Fenster erstellen (wir bekommen eine Surface, die den Bildschirm repräsentiert).
    pygame.init()
    pygame.mouse.set_visible(0)
    size = width, height = 160, 128
    screen = pygame.display.set_mode(size)

    sleep_time = 1
    try:
    while True:
    res = os.popen('vcgencmd measure_temp').readline()
    temperatur=res.replace("temp=","").replace("'C\n","")+" °C"
    displayText('Chip-Temp.', 20, 1, (200,200,1), True )
    displayText( temperatur , 30, 2, (255,0,0), False )
    pygame.display.flip() #Update the full display Surface to the screen
    time.sleep(sleep_time)
    except KeyboardInterrupt:
    print ("Ende")
    sys.exit()

    if __name__ == '__main__':
    main()
    [/php]

    In:

    Spoiler anzeigen

    [code=php]
    def main():
    global screen

    # Initialisieren aller Pygame-Module und
    # Fenster erstellen (wir bekommen eine Surface, die den Bildschirm repräsentiert).
    pygame.init()
    pygame.mouse.set_visible(0)
    size = width, height = 160, 128
    screen = pygame.display.set_mode(size)

    sleep_time = 1

    while running:
    res = os.popen('vcgencmd measure_temp').readline()
    temperatur=res.replace("temp=","").replace("'C\n","")+" °C"
    displayText('Chip-Temp.', 20, 1, (200,200,1), True )
    displayText( temperatur , 30, 2, (255,0,0), False )
    pygame.display.flip() #Update the full display Surface to the screen
    time.sleep(sleep_time)

    if __name__ == '__main__':
    running = True
    try:
    main()
    except KeyboardInterrupt:
    running = False
    print ("Ende")
    [/php]

    Beim genaueren Betrachten fallen mir aber auch noch ein paar Kleinigkeiten auf die Ich ändern würde ;)

  • @ meigrafd
    Ich habe die Änderung eingebaut und bekomme ich jetzt eine neue Fehlermeldung:

    Der Code sieht so aus:

  • Rein optisch sieht man doch schon den Grund ;)

    Python mag es absolut nicht wenn Einrückungen nicht passen - der Abstand von links.
    In diesem Fall ist das "running = True" um ein Leerzeichen zu weit eingerückt, also zu weit rechts, weiter als das nachfolgende. Vor "running = True" sind 5 Leerzeichen, vor "try:" sind aber 4.

  • Kann ich nicht bestätigen.
    Hab das Script grad probiert und es lässt sich wie vorgesehen mithilfe STRG + C beenden, vielleicht auch 2x drücken aber es lässt sich in jedem Fall beenden ohne den ganzen PI zu killen :fies:


    Vergleichsweise das selbe als klein gehaltenes nur für die Konsole:


    Aber beiläufig erwähnt würde ich zum jede Sekunde auslesen der CPU Temperatur nicht vcgencmd verwenden - das verursacht selbst nämlich einiges an CPU Last.
    Benutz stattdessen lieber:

    Spoiler anzeigen

    [code=php]
    #!/usr/bin/python
    # -*- coding: iso8859-1 -*-
    #
    import time, os

    def main():
    sleep_time = 1

    while running:
    with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
    CPUtemp = int(float(f.readline().split()[0]))
    CPUtemp = round((CPUtemp/1000.0), 2)
    print str(CPUtemp) +" °C"
    time.sleep(sleep_time)

    if __name__ == '__main__':
    running = True
    try:
    main()
    except KeyboardInterrupt:
    running = False
    print ("Ende")
    [/php]

  • Hä wie geht das? Ich drücke mehrmals CTRL+C aber nichts passiert.
    Mal noch eine Frage: kann es sein, dass wenn das Display angesteuert wird die Tastatur abgeschaltet oder nicht ausgewertet wird?

    Ich versuche nur den Fehler hier einzugrenzen.

    • Offizieller Beitrag

    Ich hab aber kein Display dranhängen...in Ermangelung selbigen. also muss es entweder an os.environ oder pygame oder beidem liegen. Gut, dann lass uns mal versuchen ob signal dem Problem Herr wird:

  • Danke
    habe ich getestet - geht auch nicht gleiches Ergebnis
    Noch was ist mir aufgefallen:
    Wenn ich das Programm von der Konsole mit "sudo python tft3.py" starte springt der Cursor in die nächste Zeile an den Anfang und blinkt noch 4x und verschwindet dann.
    In diesem Augenblick erfolgt die Anzeige auf dem Display.

  • habe die erste Änderung durchgeführt _ gleiches Ergebnis

    Dann habe ich die os.environ... rausgenommen. Nach dem starten wird der Bildschirm schwarz, der Cursor verschwindet und das war's dann.

    Die grüne LED am Pi blinkt ca. alle 3 sek. einmal.
    Aber CTRL+C geht nicht

    Als letzten Versuch für heute habe ich ein kurzes Testprogramm geschrieben ohne "pygame"

    Das funktioniert. Es ist ohne Probleme mit CTRL+C zu beenden.

    Einmal editiert, zuletzt von Raspau (11. Februar 2015 um 23:52)

  • So nun habe ich die Lösung :thumbs1:

    Ich habe mich mit pygame etwa sintensiver auseinander gesetzt und habe dabei verstanden wie eine Abbruchsbedingung programmiert wird. Schlussendlich geht es um die Auswertung von "pygame.event.get()".

    Wie folgt sieht mein Programm so aus:

    Ich habe gleich ein paar Kommentare dazu geschrieben. Ich denke daran ist erkennbar wie man das TFT-Display anspricht, befüllt, löscht und auch das programm unterbricht (ohne CRTL+C oder sys.exit())

    Gruß Andreas:D

    da ist noch ein kleiner Fehler drin.

    falsch ist

    Code
    # Programm beenden, wenn wir ein Quit-Event finden.
                if event.type == pygame.QUIT():
                    running = False

    richtig ist

    Code
    # Programm beenden, wenn wir ein Quit-Event finden.
                if event.type == pygame.QUIT:
                    running = False

    Einmal editiert, zuletzt von Raspau (12. Februar 2015 um 21:15)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!