Suche einfache lib für OLED (SSD1306)

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
DL3AD
User
Beiträge: 31
Registriert: Montag 31. August 2015, 19:03

Hallo,
ich möchte am Raspi zero2W ein OLED betreiben dass nur simplen Text ausgibt.
Nun suche ich eine EINFACHE lib die nicht so aufgeblasen ist.
Mit der luma.OLED habe ich schon gearbeitet - kann jede menge - brauch ich aber nicht.

Kann mir da jemand was einfaches empfehlen ?

Und noch ne Frage - PyPi kenne ich als Package Index - gibt es da auch noch andere Quellen ?

Gruß
Frank
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DL3AD: Was genau ist denn das Problem mit `luma`? Wenn's ein Mikrokontroller wäre könnte da was ”aufgeblasen” sein, aber beim Zero 2 sehe ich da erst einmal keinen Grund irgendwie ”sparsam” zu sein, in dieser Richtung‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Von aufgeblasenen Bibliotheken muss man ja nichts benutzen, das man nicht benutzen will. Wenn die also tut, wuerde ich sie auch einfach benutzen. Was einfacheres googeln muesste ich genauso, und dann ist ja die Frage, was einfach ist, und was aufgeblasen - fuer mich ist die Luma-OLED zb nicht aufgeblasen, werde ich dir also wohl auch nix besseres anbieten koennen (ich benutze zB u8g2, die ist nicht einfacher).

Der PyPi ist das mir einzig bekannte globale Repository fuer normales Python. Conda ist eine Alternative, aber eher speziell fuer Data-Scientists und Windows-User. Und man kann seinen eigenen Package Index betreiben, das macht man aber eher im Firmenkontext, um zu verhindern, das Pakete upstream einfach veschwinden.
DL3AD
User
Beiträge: 31
Registriert: Montag 31. August 2015, 19:03

Danke für die schnellen Antworten.
Ja, die u8g2 nutze ich auch - die ist simpel im gebrauch.
Es ist z.b. halt läßtig bei jeder Textausgabe Font und Textfarbe anzugeben - kann man das nicht fest einstellen ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man das nicht immer angeben will, schreibt man sich eine Hilfsfunktion, die das einfach macht, und nur die Angaben macht, die man will. Oder man benutzt functools partial.

Code: Alles auswählen

class CanvasWrapper:
    def __init__(self, canvas, font, fill, outline):
        self._canvas = canvas
        self._font = font
        self._fill = fill
        self._outline = outline
    def __getattr__(self, name):
        def _wrapper(*a, **kw):
            kw["outline"] = self._outline
            kw["font"] = self._font
            kw["fill"] = self._fill
            return getattr(self._canvas, name)(*a, **kw)
        return _wrapper
Das ist jetzt ohne Gewaehr, weil nicht ausprobiert. Aber so in der Art baut man sich das zusammen.
DL3AD
User
Beiträge: 31
Registriert: Montag 31. August 2015, 19:03

Danke _deets_
hätte ja sein können dass es einfacher geht - aber dann bastle ich mir was.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe in der Dokumentation nix gefunden.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich müsste mal kurz eine Zwischenfrage stellen. Ich würde gern versehen wie das Codebeispiel von @__deets__ funktioniert. Also unabhängig von dem Problem hier, sondern die Programmstruktur an sich.
Wie rufe ich dass denn auf? Wo kommt 'a' und 'kw' und 'name' her? Könnte man das Beispiel etwas verallgemeinern, dass ich das unabhängig aufrufen kann und probieren kann, wie das im Detail funktioniert.

Wenn ich eine Instanz der Klasse erstelle, dann wird mir die Funktion '_wrapper' zurück gegeben? Und was dann so passiert kann ich mir noch nicht zusammen reimen.


Vielen Dank und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Hast Du `__getattr__()` mal angeschaut? `name` ist der Name des Attributs. Und `a` und `kw` sind die Argumente die Du beim Aufruf der ”Methode”, also letztlich der `wrapper()`-Funktion übergibst. Also wenn Du so ein `CanvasWrapper`-Objekt hast, und dann ``canvas_wrapper.some_method_name(1, 2, answer=42)`` ausführst, dann ist `name` "some_method_name", `a` ist [1, 2], und `kw` ist {"answer": 42}.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DL3AD
User
Beiträge: 31
Registriert: Montag 31. August 2015, 19:03

Hallo,
also - canvas scheint ja die beschreibbare Fläche des Displays zu sein.
Wenn ich nun eine Zahl auf dem Display ändern möchte dann wird ja das gesammte canvas neu geschrieben - ist das normal ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kann sein, muss aber nicht. Wobei ich den Betrieb eines SSD1306 auch nur so kenne. Man kann den Bilschirm da auch kleinteiliger ansteuern, kenne aber keinen der das macht. Theoretisch koennte die Bibliothek aber auch zwei Frames vergleichen, und nur "dirty rectangles" uebertragen. Ob sich eine solche Mikrooptimierung bei einer Zyklenzeit von 40ms lohnt, sei mal dahingestellt.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

@__blackjack__ Danke für die Antwort. Ja habe ich mir angeschaut. In dem Code gibts ja eigentlich keine Methode, nur Attribute(?). Ich glaube ich bin ein Stück weiter.

Zur Vereinfachung mal das Beispiel:

Code: Alles auswählen

class CanvasWrapper:
    def __init__(self, canvas, color):
        self._canvas = canvas
        self._color = color

    def __getattr__(self, name):
        def _wrapper(*a, **kw):
            kw["color"] = self._color
            return getattr(self._canvas, name)(*a, **kw)
        return _wrapper
Dann erstelle ich eine Instanz:

Code: Alles auswählen

canvas_wrapper = CanvasWrapper(canvas, color="red")
Jetzt brauche ich irgendwann die Frabe Grün, dann mache ich folgendes:

Code: Alles auswählen

canvas_wrapper.color = 'green'
Dabei wird '__getattr__' ausgeführt. 'name' ist 'color' und '__getattr__' gibt die Funktion '_wrapper' zurück. Wo wird die aufgerufen? Ich verstehe auch nicht wie die Argumente 'a' und 'kw' ihre Werte bekommen. Ich habe mal ein 'print' in '_wrapper' gesetzt, der Code läuft fehlerfrei durch, aber es wird nichts ausgegeben.
Irgendwie fehlt mir da noch ein Gedankengang, beziehungsweise der Funktionsaufruf. Ich meine, es ist mir klar, das nach

Code: Alles auswählen

canvas_wrapper.color = 'green'
'kw' so aussieht

Code: Alles auswählen

kw = {'color': 'green'}
Aber das würde für mich nur Sinn machen, wenn irgendwo die Funktion mit Argumenten aufgerufen wird.
Vielleicht habe ich mich auch mal wieder ganz verrannt.

Vielen Dank und Grüße
Dennis

P.S. Kann/sollte man das vielleicht in ein extra Thema auslagern?
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Methoden sind auch nur Attribute.

Bei ``canvas_wrapper.color = 'green'`` wird `__getattr__()` gar nicht aufgerufen weil hier kein Attribut *geholt* sondern *gesetzt* wird.

``canvas_wrapper.line((0, 0), (42, 23), width=2)`` wäre ein Beispiel. Da wird `__getattr__()` mit `name` als "line" aufgerufen es wird die `_wrapper()`-Funktion erstellt und zrückgegeben. Und die wird dann mit den Argumenten aufgerufen die da angegeben sind, also `a` ist ``[(0, 0), (42, 23)]`` und `kw` ist ``{"width": 2}``.

`_wrapper()` ergänzt dann `kw` durch den "color"-Eintrag und holt sich dann von `self._canvas` das `line`-Attribut und ruft das mit den Argumenten in `a` und `kw` auf.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Achsooo, ich glaube ich habs kapiert. Vielen Dank 🙂

Das ist ja echt genial. Hoffentlich kann ich so etwas auch mal bei mir irgendwo einbauen.👍🏼


Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten