Tastendruck verlängern

  • Hallo Dennis,

    das Script macht schon mal fast, was es soll. Einziges Manko: der Standardbildschirm mit Uhr und Tastenbelegung wird nicht gelöscht. Die Infos bei Tastendruck werden einfach drüber geschrieben. Man müßte also wohl erstmal ein Schwarzbild schreiben, um das Display zu leeren. Die Displayinhalten von Taste A und B werden aber ordnungsgemäß wieder entfernt nach der Wartezeit und man sieht wieder die Startseite korrekt.

    Edit:

    Ich hab bei den Tastenabfragen jeweils

    Code
    self.draw.rectangle((0, 0, self.width, self.height), outline=0, fill=(0, 0, 0))

    eingefügt, jetzt macht das Script, was es soll. ;)

    Einmal editiert, zuletzt von Regdone (5. Januar 2022 um 19:18)

  • Hört sich ja nich schlecht an.

    Ich habe eine zusätzliche Funktion gemacht, die den Bildschirm jetzt immer erst löschen soll.

    Zu deiner vorherigen Frage mit deinen Infos. Schau dir mal Zeile 52 und 59 an, da wird die Zeit und das Datum aus dem 'datetime'-Modul direkt eingefügt.

    Für deine weiteren Infos habe ich in Zeile 28-33 Namen (nach deinem Vorbild) definiert. Diese werden in der Funktion 'took_some_information' an Werte gebunden. Für 'type' habe ich dir ein 'subprocess.run' beispiel geschrieben und für 'up' habe ich __blackjack__ 's Vorschlag übernommen.

    Da ich mich mit den Befehlen, die du verwendest nicht so auskenne, überlasse ich das vervollständigen dir oder wer sonst Lust hat.

    Die entsprecheden Namen gegen die 'CPU' etc. austauschen und den Rest kannst du beliebig anpassen.


    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis,

    vielen Dank. Ich hab es ausprobiert, so richtig funktioniert das alles leider noch nicht. Das Datum ist im anglo-amerikanischen Format (YYYY-MM-DD), bei der Uhrzeit laufen nach den Sekunden noch sechsstellig die 100000stel Sekunden mit und bei Drücken von Taste B stürzt das Script mit folgender Fehlermeldung ab:

    Ich muß ersteinmal versuchen, in Deinen Code mich hineinzudenken, da ist einiges, was mein Wissen zur Zeit noch übersteigt, da Du einiges nicht mit den "normalen" Linux-Befehlen realisiert hast, ich also mit meinen rudimentären Kenntnissen leider nicht weiterkomme. Für meine bescheidenen Fähigkeiten war die Definition mit CMD und dann dem Linux-Befehl sicherer. ;)

  • Hallo,

    wenn du den Code so wie er da steht übernommen hast, dann kann er auch nicht funktionieren, siehe dazu mein Kommentar in Zeile 93.

    Das Formatieren der Zeit oder des Datum ist in Python auch relativ einfach:

    Code
    # formated time
    datetime.now().strftime('%H:%M:%S')
    
    # formated date
    datetime.now().strftime('%A, %d %h %Y')

    Wie gesagt, du musst die Funktion fertig schreiben, meinen Kommentar lesen und das Kommentarzeichen (#) vor dem Funktionsaufruf entfernen und dann sollte es, hoffentlich, hinhauen.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis,

    mit der Formatierung von Datum und Uhrzeit, das klappt, war ja wirklich einfach ;)

    Das Auskommentieren hatte ich mir nicht richtig angesehen, Du hattest Zeile 95 geschrieben, dort war aber ohne Kommentar die Positionierung "X". Hätte ich genauer hingesehen, wäre mir aufgefallen, daß ich die 93 aktivieren muß, weil da die Funktion aufgerufen wird. Erledigt.

    Auch Deine Beispielaufrufe der Funktionen hab ich hoffentlich verstanden und kann -wenn es denn funktioniert- hoffentlich danach alle meine Aufrufe bauen.

    Leider bricht das Script genau beim Aufruf der ersten Funktion ab und meckert einen Fehler im Programmaufruf an:

  • Da ist ein Tippfehler in der vorletzten Zeile:

    Python
       def took_some_information(self):
            self.type = run(
                [
                    "cat",
                    "/sys/firmware/devicetree/base/model",
                    "|",
                    "sed" "s/^.*Raspberry /Modell: /",
                ],

    Es fehlt ein Komma zwischen "sed" und "s/...."

  • Code
    self.type = (run(["cat", "/sys/firmware/devicetree/base/model"],
                check=True,
                capture_output=True,
            ).stdout).decode('utf-8')

    Oder du importierst ganz oben in der Datei noch: from pathlib import Path und machst dann:

    Code
    self.type = Path("/sys/firmware/devicetree/base/model").read_text()

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis,

    es funktioniert. Ich hoffe, ich komm nun erstmal allein weiter, wenn nicht, muß ich mich nochmal melden! Danke!

    simonz,

    bis auf das nun gesetzte Komma, in der Befehlswiedegabe der Fehlermeldung war die Fehlermeldung absolut identisch

  • So, leider zu früh gefreut. Ich schaff es nicht, meine Aufrufe zur Anzeige zu bringen.

    Ich habe die Funktionen und andere zum Programm in meinem urprünglichen Script über "subprocess" und dann CMD aufgerufen und konnte dort die normalen Shell-Kommandos aufrufen inkl. weiterer Verarbeitung mit "sed", "awk" usw, wo ich die Ausgabe noch formatieren bzw. mir nur das für mich interessante herausholen konnte.

    Das gelingt mir nun leider nicht mehr.

    Wenn ich z.B. an self.type = Path("/sys/firmware/devicetree/base/model").read_text() (oder mittels run und cat) mit mit sed etwas von der Ausgabe abschneiden will oder das ganze mit awk machen will, bekomm ich immer Fehlermeldungen mit returned non-zero exit status 1 oder Befehl nicht gefunden.

    Im vorliegenden Fall z.B. bei der Anzeige des Modells habe ich das ganz einfach mittels sed gemacht:

    Code
    cmd = "cat /sys/firmware/devicetree/base/model| sed 's/^.*Raspberry /Modell: /'"
    TYPE = subprocess.check_output(cmd, shell=True).decode("utf-8")

    Damit führe ich den Shell-Befehl:

    Code
    cat /sys/firmware/devicetree/base/model| sed 's/^.*Raspberry /Modell: /'

    aus und geb damit den Type des Raspi aus. Davor schreib ich mittels sed "Modell:" und weil der Platz auf dem Display nur begrenzt ist, schneide ich Raspberry von der standardmäßigen Textausgabe ab. Es wird mir also z.B. statt der regulären Ausgabe Raspberry Pi Zero W Rev 1.1 angezeigt:

    Modell: Pi Zero W Rev 1.1

    Ich will jetzt nicht über Sinn und Unsinn dieser Ausgabe diskutieren, das ist nur ein Beispiel mit dem ich versuche, das ganze zu verstehen und irgendwie zu beherrschen.

    Leider klappt das mit dem Script und den Vorschlägen von Dennis nicht. Ich hab schon alles versucht mit Anführungszeichen (einfach und doppelt) zu maskieren, unterschiedliche Zeilen oder in einer Zeile.

    Leider steck ich nicht so gut in der Python-Materie, um das lösen zu können. Alles was nach dem "|" steht, führt zu Fehlermeldungen.

    Ich glaub, ich werde wohl oder übel zu meiner "unvollkommenen" Programmierung zurück gehen müssen und auf das "Stehenbleiben" der Displayausgabe nach Tastendruck verzichten. Der Aufwand ist offenbar doch sehr hoch und allein schaff ich das nicht. Zumindest noch nicht.

    Tante Google konnte mir da leider auch noch nicht wirklich helfen. Leider.

  • Hallo,

    dein Problem ist jetzt das formatieren von Strings und das lesen von Dateien.

    Erstell mal eine neue Python-Datei und füge folgendes ein:

    Ich hoffe das ist verständlich geschrieben. Google dazu bitte noch oder schau in der Python-Dokumentation nach. Es gibt mehrere Möglichkeiten, ich dachte dass das vielleicht die verständlichste ist.

    Achja und *nie* Code wie oben ohne Funktionen schreiben. Das ist nur, dass du die einzelnen Schritte siehst und nicht abgelenk wirst.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis,

    erstmal vielen Dank für Deine Geduld. Ich werde das jetzt erstmal versuchen nachzuvollziehen und zu verstehen. Leider ist mein "Jahreswechselurlaub" nun zu Ende und ich muß das etwas einschränken, ich geh ja noch einer gergelten Arbeit nach ;) Ich meld mich auf jeden Fall zurück!

  • Leider ist mein "Jahreswechselurlaub" nun zu Ende und ich muß das etwas einschränken, ich geh ja noch einer gergelten Arbeit nach

    Trifft für mich auch zu, deswegen nicht wundern wenn meine Antworten nun verzögerter kommen.

    Na dann frohes arbeiten oder halte durch, was auch immer zutrifft :angel:

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis,

    ich habe mal wieder etwas Zeit zum Spielen gehabt. F-String war das Zauberwort für Tante Google, ich glaub, das hab ich alles verstanden.

    Aber mein Grundproblem besteht immer noch. Ich möchte gern eine Kommandozeile ausführen und das Ergebnis anzeigen. So wie ich es im Ursprungsscript mit subprocess gemacht habe.

    Wenn ich z.B. "hostname -I" in der Shell eingebe, dann erhalte ich die IP-Adresse. Diese müßte ich nun aber auf dem Display ausgeben können. Mit subprocess hab ich das problemlos realisiert. In der ersten Zeile mit CMD das Linux-Kommando gesetzt, in der nächsten meinen selbst definierten Variablennamen und die Formatierung und evtl. Zusatztext, der mit ausgegeben werden soll.

    In meinem Beispiel also

    Code
     cmd = "hostname -I"
     ip = "IP: "+subprocess.check_output(cmd, shell=True).decode("utf-8")

    In der ersten Zeile wird das Kommando definiert, könnte auch noch mit "|" erweitert werden um weitere Befehle (sed, awk usw.), in der zweiten Zeile mein Variablenname (ip) und der auszugebende Text mit vorangestelltem "IP:"

    Bei der Bildschirmausgabe habe ich mir das dann mit "draw.text...[Position x,y][Variablenname][Formatierung]" geholt.

    Das wäre das, was ich gern machen würde. Ich hoffe, es ist verständlich, was mein Problem ist. Die IP auszulesen ist nur ein Beispiel, daß man an diese auch anders herankommt, weiß ich.

    Daran scheitere ich gerade noch - leider.

  • Regdone ``shell=True`` sollte man nicht machen und ja dann fallen so sachen wie Pipes (``|``) auch weg. Aber wozu ``sed``, ``awk`` und so weiter wenn man ein *Python*-Programm schreibt? Man benutzt Pipes mit ``sed``, ``awk`` & Co ja nicht weil die so toll sind, sondern weil die Shell so sch……e ist und nix kann und selbst einfache Textverarbeitung dort zur Tortur würde wenn man keine Werkzeuge oder gar komplette Programmiersprachen wie ``awk`` zu Hilfe nehmen könnte. Python hat einen ganzen Haufen Werkzeuge für Zeichenkettenverarbeitung an Board, da braucht man kein ``sed`` & Co für.

    Das Dekodieren kann man sich übrigens sparen wenn man ``universal_newlines=True`` als Argument beim jeweiligen `subprocess`-Aufruf mit gibt, denn dann wird das Ergebnis passend als Text dekodiert, auch ohne das man die Kodierung angeben muss, die ja von Systemeinstellungen abhängt.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo,

    jetzt komme ich auch noch mit einer Antwort daher.

    F-String war das Zauberwort für Tante Google, ich glaub, das hab ich alles verstanden.

    Dann könntest du das in deinem Beispiel-IP-Code auch verwenden. 8o

    Dein 'cmd' besteht ja aus einem Befehel und einer zusätzlichen Option. 'subprocess' erwartet an dieser Stelle laut Dokue '*args'. Ne da ist keiner auf der Tastatur eingeschlafen, das bedeutet 'subprocess' hätte gern ein Objekt über das er iterieren kann. So wie man das zum Beispiel mit einer 'for'-Schleife bei Listen macht. Das ist ein geschickter Vergleich, du könntest deine Befehle in eine Liste schreiben und die dann übergeben. Dann lass dir aber zum Vergleich mal noch das "Ergebnis" ausgeben, dass das 'split' von hyle fabriziert. Vielleicht ist das ja auch eine Liste :geek:

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

Jetzt mitmachen!

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