Seite 1 von 1

Abfragen mehrerer if-Bedingungen hintereinander

Verfasst: Samstag 30. November 2019, 18:00
von BunkerBaerIGER
Hey ich in neu in der Python-Programmierung und bin gerade dabei mir ein Radio mit einem RaspberryPi 3 zu bauen.
Das Radio funktioniert soweit auch.
Nun möchte ich gern ein LCD-Display als Anzeige benutzen.
Es scheint irgend einen Fehler in meinem Code zu geben aber ich finde seit Stunden keine Lösung...
Ich habe schon einige Erfahrung in VB.net daher sollte es von der Grundidee funktionieren.
Ich benutze MPD zur Abfrage der Daten.

Wäre nett wenn sich mal Jemand meinen Code ansehen würde :)

Code: Alles auswählen

def main():
  # Main program block

  # Initialise display
  lcd_init()
  global current_volume

  get_status = client.status()
  if 'volume' in get_status:
     current_volume = get_status['volume']


# Display Method
while True:
#while player is running
        while client.status()['state'] == "play":

            #Display Volume Changes Start
            get_status = client.status()
            if get_status['volume'] != current_volume:
                if current_volume > get_status['volume']:
                    diff = int(current_volume) - int(get_status['volume'])
                    lcd_string('Volume: ' + '-' + str(diff), LCD_LINE_2, 2)
                    lcd_string('', LCD_LINE_3, 2)
                    time.sleep(1)
                else:
                    diff = int(get_status['volume']) - int(current_volume)
                    lcd_string('Volume: ' + '+' + str(diff), LCD_LINE_2, 2)
                    lcd_string('', LCD_LINE_3, 2)
                    time.sleep(1)

            current_volume = get_status['volume']
            lcd_string('Volume: ' + current_volume, LCD_LINE_2,2)
            lcd_string('', LCD_LINE_3, 2)
            time.sleep(1)
            #Display Volume Changes End

            #Display Channel / Title / Artist (if isdefined) Start
            get_song = client.currentsong()

            if 'name' in get_song:
                channel = 'Radio: ' + str(get_song['name'])
                lcd_string(channel, LCD_LINE_1, 1)
            else:
                channel = 'Radio: ' + 'Unknown')
                lcd_string(channel, LCD_LINE_1, 1)

            if 'title' in get_song:
                LongTitle = get_song['title']
                if '-' in LongTitle:
                    Artist, Title = LongTitle.split('-')
                else:
                    Title = LongTitle
                    Artist = ' '
                if Title != '':
                    lcd_string(Title, LCD_LINE_2,2)
                else:
                    lcd_string('', LCD_LINE_2, 2)

                if Artist != '':
                    lcd_string(Artist, LCD_LINE_3,2)

            print(get_song)
            #lcd_string('',LCD_LINE_3,3)
            lcd_string(song_elapsed()+" / Stream Time",LCD_LINE_4,3)
            # Display Channel / Title / Artist (if isdefined) End
            
        #while player is not running
        while client.status()['state'] != "play":
            # Display Clock
            lcd_string(datetime.now().strftime('%H:%M'),LCD_LINE_2,2)
            lcd_string(datetime.now().strftime('%m/%d/%Y'),LCD_LINE_3,2)
            lcd_string('', LCD_LINE_1,2)
            lcd_string('', LCD_LINE_4,2)
            time.sleep(1)

    time.sleep(0.1)

Re: Abfragen mehrerer if-Bedingungen hintereinander

Verfasst: Samstag 30. November 2019, 18:34
von __deets__
Da ist ne Menge im Argen - vor allem alles in so ein Riesen Batzen Code zu packen, unnötige Codedopplungen, Mehrfachabfrage des Status, schlechte Namen (get_status klingt nach einer Funktion, ist aber ein dict),

Und das Grundproblem sind die diversen while schleifen. Davon braucht es genau eine, außen rum. Und die diversen sleeps. Auch die dürfen nicht sein, nur ein kurzes.

Dann einmal den Status anfragen. Dann einmal Dinge wie Volume etc auslesen & auch nur einmal zu int konvertieren. Wenn etwas eine Weile lang dargestellt werden soll, dann ausrechnen bis wann, und wenn die Zeit verstrichen ist entsprechend wieder was anderes darstellen. So hat man zwischendurch noch die Möglichkeit auf wiederum anderer Dinge wie zb verstreichen der Zeit zu reagieren.

Re: Abfragen mehrerer if-Bedingungen hintereinander

Verfasst: Samstag 30. November 2019, 19:24
von BunkerBaerIGER
__deets__ hat geschrieben: Samstag 30. November 2019, 18:34 Da ist ne Menge im Argen - vor allem alles in so ein Riesen Batzen Code zu packen, unnötige Codedopplungen, Mehrfachabfrage des Status, schlechte Namen (get_status klingt nach einer Funktion, ist aber ein dict),

Und das Grundproblem sind die diversen while schleifen. Davon braucht es genau eine, außen rum. Und die diversen sleeps. Auch die dürfen nicht sein, nur ein kurzes.

Dann einmal den Status anfragen. Dann einmal Dinge wie Volume etc auslesen & auch nur einmal zu int konvertieren. Wenn etwas eine Weile lang dargestellt werden soll, dann ausrechnen bis wann, und wenn die Zeit verstrichen ist entsprechend wieder was anderes darstellen. So hat man zwischendurch noch die Möglichkeit auf wiederum anderer Dinge wie zb verstreichen der Zeit zu reagieren.
Vielen Dank schon mal für die Antwort.
Kannst du mir sagen wie ich am besten das mit den If Abfragen löse? Es soll halt nur auf dem LCD Text erscheinen falls dieser auch über MPD verfügbar ist und wie umgehe ich das mit der Wartezeit?
Ich verstehe nicht ganz was du mit "ausrechnen bis wann" meinst. Im Internet finde ich nur time.sleep()

Re: Abfragen mehrerer if-Bedingungen hintereinander

Verfasst: Samstag 30. November 2019, 20:08
von __blackjack__
@BunkerBaerIGER: Wenn von jetzt bis in 2 Sekunden etwas angezeigt werden soll, dann rechnet man den Zeitpunkt wann das nicht mehr angezeigt werden soll aus in dem man den aktuellen Zeitpunkt nimmt und 2 Sekunden drauf rechnet. `time.sleep()` rechnet nicht, das wartet, und während das wartet kann halt nix anderes passieren. Also zum Beispiel kann man in der Zeit dann nicht feststellen das sich der Song oder irgendein anderer Zustand geändert hat. Wenn Du den Endzeitpunkt der Wartezeit berechnest, kannst Du weiterhin alles abprüfen, inklusive testen ob der Endzeitpunkt schon erreicht ist und etwas anderes dargestellt werden soll.

Der Code ist übrigens gar nicht lauffähig. Neben fehlenden importen ist die Einrückung kaputt und selbst dann ist da noch mindestens ein Syntaxfehler wegen einer Klammer die zu nichts zu gehören scheint.

``global`` solltest Du auch ganz schnell wieder vergessen, das hat in einem ordentlichen Programm nix zu suchen.