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: 14210
- 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‽
            
			
									
						
							“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
			
						it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
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: 14210
- 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}.
            
			
									
						
							“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
			
						it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
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 _wrapperCode: 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: 14210
- 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.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
			
						it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
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]
			
						

