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
Suche einfache lib für OLED (SSD1306)
- __blackjack__
- User
- Beiträge: 13931
- 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‽
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
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.
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.
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.
Das ist jetzt ohne Gewaehr, weil nicht ausprobiert. Aber so in der Art baut man sich das zusammen.
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
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
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]
- __blackjack__
- User
- Beiträge: 13931
- 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}.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
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.
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:
Dann erstelle ich eine Instanz:
Jetzt brauche ich irgendwann die Frabe Grün, dann mache ich folgendes:
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
'kw' so aussieht
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?
@__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
Code: Alles auswählen
canvas_wrapper = CanvasWrapper(canvas, color="red")
Code: Alles auswählen
canvas_wrapper.color = 'green'
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'
Code: Alles auswählen
kw = {'color': 'green'}
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]
- __blackjack__
- User
- Beiträge: 13931
- 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.
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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
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
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]