Beiträge von miriki

    Moinsens!

    Ich weiß nicht, was ich gerade falsch mache, aber vielleicht kann mir hier jemand auf die Sprünge helfen. Was ich möchte:

    Main startet per MPDClient einen Radio-Stream und dann einen Thread mit einer Endlos-Schleife (Abbruch per globaler Boolean-Variable). In diesem soll per radio.idle() gewartet werden, bis sich was Relevantes im Stream ändert, diese aktualisierten Informationen dann in globale Variablen speichern und dann auf die nächste Änderung warten. Das Main soll dann seinerseits in einer Endlos-Schleife (mit sleep()-Pause) schauen, ob sich was geändert hat und das dann ggf. auf dem Terminal ausgeben.

    Die Schleife im Thread funktioniert auch prima, aber: Nach dem Aufruf von

    Code
    t1 = threading.Thread( target = getRadioInfo_Loop() )


    macht das Main nicht weiter, während die Schleife im Thread jetzt die ganze Zeit läuft. Erkennbar ist das an den Debug-Print. Es wird noch "1" ausgegeben, aber nicht mehr "2", dafür aber "Thread 1 tick" immer wieder mal.

    Kernfrage also: Was muß ich tun, damit die Zeile

    Code
    print "2"


    im u.a. Programm ausgeführt wird?


    Der komplette Source:

    Ich vermute das dein Theme einfach kein Horizontal orientierte Scale besitzt ...


    Wie kann ich das feststellen?

    Laut s.theme_names() habe ich ( 'clam', 'alt', 'default', 'classic' ), wovon s.theme_use() dann sagt, daß 'default' benutzt wird.

    Und müßte der Interpreter nicht bei
    s.configure( "Horizontal.miriki.TScale", background = bg, foreground = fg )
    bereits entweder meckern oder das Layout anlegen, wenn's nicht da wäre?

    Laut scl.winfo_class() benutzt das Scale 'TScale'. Und wenn ich mit s.configure die Werte von 'TScale' ändere, dann ändern sich auch die Farben in der Darstellung - wohlgemerkt, ohne daß ich Horizontal oder Vertical mit dazu angegeben hätte. Also, s.configure ändert die Farben mit:
    s.configure( "TScale", background = bg, foreground = fg )
    Es tut sich aber nichts, wenn ich "miriki.TScale" oder "Horizontal.miriki.TScale" benutze. Das funktioniert nur bei miriki.TLabel und miriki.TButton, weil ich denen im Nachhinein ja das custom-style zuweisen kann.

    Wenn ich mit
    ... style = "miriki.TScale"
    zuweisen will, erhalte ich die o.a. Fehlermeldung - Der Interpreter ergänzt also selbständig um das "Horizontal.". Wenn ich "Horizontal.miriki.TScale" zuweisen will, erhalte ich (wie erwartet) die Fehlermeldung, daß "Horizontal.Horizontal.miriki.TScale" nicht gefunden wird.

    Letztendlich wird das TScale wohl eh nicht das Widget meiner Wahl bleiben, zumindest nicht für den aktuellen Zweck. Anscheinend kann man den Schieber nur in einer (und aus meiner Sicht: der falschen) Richtung anpassen. Ich sehe z.Z. noch keine Möglichkeit, z.B. den vertikalen Schieber auf die volle Widget-Breite auszudehnen. Und wenn man das Fenster maximiert, sieht das ziemlich blöd aus, wenn da in einer breiten Spalte so ein kleines Schieber-Krümelchen hängt. Außerdem kriege ich nur den Schieber selbst mit fg eingefärbt. Der ganze Hintergrund scheint grau zu bleiben, auch wenn ich bg ändere. Da hab ich wohl noch irgendeine configure-Option bislang nicht gefunden.

    Gruß, Michael

    Moinsens!

    Ich hab meine Anwendung von vornherein auf ttk ausgelegt, weil ich mir von den Style-Möglichkeiten einiges versprochen habe. Was bei TLabel und TButton auch auf Anhieb geklappt hat, bereitet mir bei TScale Probleme. Dort gibt es ja die Unterscheidung in Horizontal und Vertical.

    Was ich bislang habe (auszugsweise):

    Wie gesagt: TButton und TLabel funktionieren damit bereits anstandslos. Nur beim TScale bekomme ich, wenn ich den "style= ..." angebe, eine Fehlermeldung:

    Code
    _tkinter.TclError: Layout Horizontal.miriki.TScale not found

    Ich schätze, das ist wieder nur irgendso eine Kleinigkeit mit einem fehlenden Buchstaben, Groß-/Klein-Schrift oder irgendwie sowas. Aber ich find's einfach nicht.

    Mag mir da mal jemand auf die Sprünge helfen?

    Gruß, Michael

    [Grid]
    So würde ich es verstehen, aber so funktioniert es irgendwie nicht.


    Ich glaub, ich komm der Sache langsam auf die Spur. Ich schätze, ich hab die grid() Methode falsch verstanden, bin mir aber noch nicht ganz sicher.

    Laut New Mexico Tech kriegt man ein skalierbares Fenster hin mit:

    Und das funktioniert, hab ich ausprobiert. Das Beispiel oben arbeitet leider nur mit einer Zelle. Aber dort wird doch definitiv nur eine Zeile/Spalte von top mit weight versehen. Ich hab in einem anderen Script das self.rowconfigure() bzw. self.columnconfigure() in eine Schleife gepackt, die sich individuelle Werte aus einem Array zieht. Das Ergebnis:

    Python_Radio_Layout_2.png

    Was ich in dem Script aber anders habe: Beim Erstellen der Widgets gebe ich als 1. Parameter ein "self" mit. Das unterscheidet sich vom jetzigen Script - hab ich wohl einfach vergessen.

    Das testwidget.py mit 3x tk.Label erzeugt jetzt auch tatsächlich 3 gleich große Label untereinander. Da bin ich also wohl auf der richtigen Spur. Nur, wenn ich statt des mittleren Label mein eigenes Widget benutze, ist gar keins der Label mehr sichtbar, dafür aber beide Label des Widgets. Dem komm ich auch noch auf die Schliche.


    Gruß, Michael
    Automatisch zusammengefügt:

    Dem komm ich auch noch auf die Schliche.

    Das fehlende "self", auch im myWidget, war's!

    Python_Layout_success.png

    Gruß, Michael

    In deiner mywidget.py sind schon wieder die Einrückungen defekt, also im Zip.


    Im .zip sind die unveränderten Files direkt vom RasPi. Sie sind mit dem mc-Editor, also den, den man mit F4 aufruft, erstellt. Ich hab jetzt aber mal die Option "TABs mit Blanks ersetzen" aktiviert. Bislang hatte ich zwar keine Probleme mit den TABs, aber wirklich schaden kann's ja auch nicht.

    Zitat

    //EDIT: Mit der folgenden Modifikation ändern sich alle Größe:


    Hast Du das mal so ausprobiert? Wenn ich alle Deine Änderungen mal so übernehme, startet hier gar nichts mehr. Es fängt schon damit an, daß er customwidgets.py nicht mehr laden kann, weil es ja im Unterverzeichnis liegt. Es geht dann weiter damit, daß er die geometry nicht anpassen kann, weil bereits grid für Anordnung sorgt ("_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid")

    Und auch allgemein: Ich weiß nicht, wie ich es noch beschreiben soll / kann... Das Widget soll sich einfach in einer Zelle des Grids platzieren lassen und kann sicht dort benehmen, wie es will. Es hat keine anderen Zellen zu beeinflussen. Und ich will auch vom Hauptprogramm aus nicht erst dafür sorgen müssen, daß das Widget seine eigenen Label erstellt und anordnet. Genau dafür ist doch der Constructor eines Objekts zuständig. Und aber eben vor allem: Das Widget hat nichts am Layout des übergeordneten Programms herumzufummeln.

    Beispiel: Das Widget soll in Zelle 5,13 eines Grids stehen. Es bekommt die "Erlaubnis", sich in dieser Zelle in beiden Achsen voll auszubreiten. Und innerhalb des Widgets gibt es jetzt ein Grid mit 2 Zeilen für Label1 und Label2. Diese wiederum sollten dann doch im "lokalen" Koordinatenkreuz 0,0 und 0,1 stehen, oder nicht?

    In meinem Test wollte ich nur dafür sorgen, daß alle 3 Zeilen des Hauptfensters die gleiche Höhe erhalten. Das weiß ich aber nur im "Hauptprogramm". Mein Widget, daß ich in Zeile 2 packen will, kann / soll / muß / darf das nicht wissen. Und wenn ich oben noch 2 Zeilen mehr brauche, dann will ich nicht im Widget herumfummeln, sondern nur im Hauptprogramm. Zumal ich dieses Widget ja in einem anderen Programm vielleicht an ganz anderer Stelle stehen haben will. Von daher scheint mir das gridresize() im Widget an falscher Stelle zu stehen. Oder übersehe ich da was?

    Allerdings wollte ich im Widget selbst ebenfalls dafür sorgen, daß die beiden Zeilen ebenfalls die gleiche Höhe erhalten.

    Zitat

    Und beachte auch das "Label 1" von "Widget 1" überlagert wird (row=0), weshalb das auch nicht angezeigt wird ;)


    Ja aber das ist doch genau die Crux! Das Widget hat in Zelle 0,1 zu stehen und sich nicht um das Label in 0,0 oder 0,2 zu kümmern. Die beiden Label im Widget sollen zwar dann in 0,0 und 0,1 stehen, aber doch in "lokalen" Koordinaten innerhalb des Widgets. Deswegen meinte ich ja, daß ich wohl irgendwie Probleme mit self, parent und top habe.

    Das Hauptprogramm ist ein Frame (top) mit einem Grid, von dem ich nur eine Zelle 0,0 benutze. Deswegen, siehe New Mexico Tech, wird auch nur row0/column0 des toplevel mit weight=1 versehen.

    In diese Zelle kommt ein Frame (self für Application, parent für Widget) mit einem Grid für meine Application. Dieses Grid wird mit individuellen Höhen und Breiten versehen, was ich über Werte-Array und Schleife realisiere. Und in dieses Grid kommt ein Label "Label 1", ein Widget und ein Label "Label 2".

    Das Widget ist ebenfalls ein Frame (self für Widget, child für Application) mit einem Grid. Und in dieses Grid kommen Label "Widget 1" und Label "Widget 2".

    So würde ich es verstehen, aber so funktioniert es irgendwie nicht.

    Zitat

    Es ist leider auch etwas verwirrend dass in der Datei customwidgets.py "myWidget" ist aber dann auch noch eine mywidget.py existiert.


    Args, ja... Das Hauptprogramm wollte ich noch in testwidget.py umbenennen, vergessen.

    --> http://miriki.com/python/testwidget.zip


    Gruß, Michael

    Genau das macht das `import` Statement von Python.


    Danke!

    Ich hatte es anfänglich so verstanden, daß "import" für die internen binary-Module benutzt wird und hatte deswegen in der Richtung nicht weiter gelesen. Aber jetzt fand sich z.B.stackoverflow.com python-how-to-import-other-python-files als prima Erklärung und Anleitung.

    Ich hab mein Test-Programm daraufhin auch mal entsprechend aufgeteilt. Es findet sich unter http://miriki.com/python/mywidget.zip jetzt die aktualisierte Version.

    Und vielleicht nochmal zur Verdeutlichung, was ich haben möchte und was ich bislang bekomme:

    Mit Widget in der Mitte oder alternativ mit Label in der Mitte soll es so aussehen:

    Was ich bislang aber nur bekomme:

    Der nicht-zentrierte Text ist nebensächlich. Es geht mir nur um die gleichmäßige Aufteilung der 3 Zeilen im Layout.

    Wenn ich aber von winfo_toplevel() nicht nur 1 zeile, sondern 3 mit weight=1 versehe, dann bekomme ich:

    Also schätze ich mal, daß ich irgendwo mit self, parent, root, top etwas vergniesgnaddelt habe. Ich weiß nur nicht, wo... Und es bleibt die Frage offen, wo Label 1 bleibt, wenn ich das Layout in der 2. Zeile mit myWidget fülle.

    Gruß, Michael

    Das Forum scheint hier etliche Einrückungen, insbesondere nach ":", verschluckt zu haben.


    Es war nicht das Forum, es scheint bereits NotePad++ gewesen zu sein. Weg:

    Ich hab das Script vom RasPi per mc auf ein Verzeichnis in einem Mount eines Windows7-Rechner kopiert. Von dort aus hab ich es von einem Windows10-Rechner mit NotePad++ geöffnet, alles mit Strg-A markiert und hier eingefügt. Und wie ich gerade sehe: Das Script hat bereits im NotePad++ verloren gegangene Einrückungen. Gegenprobe über Putty mit dem mc-Editor (F4) und nano direkt aus dem RasPi: Alles ok.

    Wenn ich das Script über den TotalCommander-internen Viewer, statt über den externen Editor, öffne, sehen die Einrückungen ebenfalls noch korrekt aus. Wie gesagt: Ich werd mal zusehen, den obigen Beitrag zu aktualisieren.

    Gruß, Michael
    Automatisch zusammengefügt:

    Wie gesagt: Ich werd mal zusehen, den obigen Beitrag zu aktualisieren.

    Scheint nicht zu klappen... Wird mir am Bildschirm noch richtig angezeigt, verschluckt aber TABs beim einkopieren hier in den Editor.

    Das Original liegt jetzt mal auch hier:
    http://miriki.com/python/mywidget.zip

    Gruß, Michael

    Was mir aber sofort ins Auge sticht: Wieso nutzt du threading ?


    Das Widget soll sich später selbständig aktualisieren. Dafür gibt's die Möglichkeit, soweit ich das verstanden habe, ohne Extra-Thread und eben, meiner Meinung nach viel sauberer, in einem Extra-Thread. Das ist in dem o.a. Source bislang nur vorbereitet (und ausprobiert, funktionieren beide Varianten), aber erstmal deaktiviert, bis der Rest drumherum läuft.

    Zitat

    Was dann weiter auffällt ist das einige Einrückungen nicht korrekt sind, wie zum Beispiel [...]


    Geh mal davon aus, daß die Einrückungen allle richtig sind. Das Forum scheint hier etliche Einrückungen, insbesondere nach ":", verschluckt zu haben. Ich werd mal versuchen, den Beitrag zu editieren und den Source neu einzuspielen. Aber wie gesagt: Die Einrückungen stimmen - zumindest hab ich kein unnormales Verhalten bei den Debug-Ausgaben feststellen können.


    Zitat

    Und ganz so einfach wie du es dir mit dem tkinter Import gemacht hast ist es leider nicht, denn mit python3 sind die print's falsch


    Hm, ok, mag sein. Da ist's dann eine print() Funktion, oder? Aber ebenfalls erstmal unproblematisch. Per Default wird hier bei mir zumindest python2 gestartet.


    Zitat

    Blöde Frage: Wieso eigentlich überhaupt der Umweg über die Application Klasse? Wieso erzeugst du deine 3 Zeilen nicht direkt selbst? :s


    Die Application() drumherum ist nur zum Testen des myWidget(). Letztendlich will ich ein Modul abgespeichert liegen haben, daß ich diirekt ohne Nachbearbeitung in ein beliebiges Script einfügen kann.

    Btw: Gibt's ein load("file") oder irgendwas in der Art in Python? Hab da noch nichts gesehen, würde es aber blöd finden, wenn ich bei einer Änderung eines zentralen Widgets immer quer durch alle Scripte muß, die es benutzen., aber eben direkt einkopiert, statt referenziert haben.

    Gruß, Michael

    Moinsens!

    Ich hab hier ein kleines Problem und sehe nicht, was da schief läuft. Ich möchte folgendes erreichen:

    Ein Fenster, in dem sich 3 Zeilen (1 Spalte) im Grid befinden. In der oberen Zelle soll ein Label stehen, ebenfalls in der unteren. In der Mitte soll ein eigenes Widget stehen, daß aus 2 Labeln besteht. Zu Testzwecken steht in der mittleren Zelle aber auch nur ein Label, mit dem es ebenfalls nicht ganz funktioniert.

    Der Effekt: Mit Label1, Label2, Label3 sehe ich die 3 Label untereinander. Vergrößere ich dann das Fenster, wird nur Label1 in der Höhe mit vergrößert, während Label2 und 3 in der Höhe unverändert bleiben.

    Noch komischer: Ersetze ich das mittlere Label2 durch myWidget, verschwindet Label1 und das myWidget scheint sich irgendwie auf die oberen beiden Zellen zu verteilen.

    Zum Aufbau des Fensters, insbesondere für das "resize", benutze ich die Vorgehensweise von New Mexico Tech, die in einem anderen Script auch bereits hervorragend funktioniert. Und ich finde einfach den Kinken nicht, der in diesem Script schief läuft.

    Ach ja: Wenn ich, entgegen der Vorgehensweise von New Mexico Tech nicht nur row0,col0 im top auf weight=1 setze, sieht die Sache schon etwas besser, aber auch noch nicht richtig aus.

    Wahrscheinlich ist's nur eine Kleinigkeit, aber ich komm irgendwie nicht weiter.

    Der komplette Source (unten im Application.createWidgets() kann mit # zwischen Label und Widget umgeschaltet werden):


    Vielleicht liegt es ja daran das Java hier so gut wie keine Rolle spielt.


    Warum eigentlich nicht?

    Zitat

    Dazu kommt noch Eclipse, auch nicht grade erste Wahl...auf dem Pi.


    Warum eigentlich nicht?

    Ich mein, ok... Ich komm aus der Homecomputer-Zeit und kenne noch das Gefrickel mit Editor, Compiler, Linker und dem ganzen Geraffel. Aber seit Jahren weiß ich den Komfort einer (grafischen) IDE zu schätzen, sei es Delphi, Visual Studio oder eben zur Not auch Eclipse.

    Gut, Pascal/Delphi ist out, beruflich brauch ich VBA (MS-Office), privat bin ich im VB.Net unterwegs und versuche parallel ein bißchen was mit Java für Android. Für ein bißchen Kleinkram hab ich auch schon einiges mit Python auf dem RasPi gemacht.

    Ich hab mir z.B. ein Radio in VB.Net gebastelt, so mit Pegel-Anzeige, Frequenz-Analyse usw.
    [isr.png]

    Und so in die Richtung wollte ich jetzt auch was auf dem RasPi hinbekommen.

    Zitat

    Der erste Treffer bei google zum Thema "eclipse import external library" sagt übrigens das.


    Links, in denen beschrieben wird, daß und wie man .jar einbindet, hab ich selbst auch genug gefunden. Der git Download hat die aber nicht, sondern nur die ganzen .java Files.
    [RasPi_JavaMPD_kein_jar.png]

    Und auch bei den .jar steht immer nur, wie man sie in das einzelne Projekt einbindet (build path). Vielleicht versteh ich's auch nur falsch, aber ich würde die Lib gerne grundsätzlich global im Eclipse zur Verfügung haben.

    Was mir aber in dem von Dir gezeigten Link helfen könnte (muß ich mich noch einlesen): Eine Antwort weiter unten spricht von "maven". Das Stichwort hab ich bei JavaMPD auch gelesen, konnte damit aber nichts anfangen. Vielleicht werd ich damit ja was...

    Gruß, Michael


    Allerding bekomme ich es nicht hin das die Zwischenablage zwischen Remote und Lokal funktioniert.

    Mit "Remote Desktop Connection" wird der entfernte Rechner _grafisch_ auf den lokalen Rechner übertragen. (Alternative wäre SSH mit z.B. Putty, das wäre eine Textmodus-Übertragung.)

    Die Zwischenablage (Clipboard) ist ein jeweils _lokaler_ Bereich im Arbeitsspeicher des jeweiligen Rechners. Etwas in einer Remote-Session in die Zwischenablage zu kopieren hat nicht immer den Effekt, den man sich wünscht.

    Beispiel: Vom RasPi wird eine X-Session per Remote Desktop Connection auf einen Windows-Rechner übertragen. Im X wird jetzt ein Texteditor gestartet und ein Bereich des Textes markiert. Was passiert jetzt, wenn man Strg-C auf dem Windows-Rechner drückt? Der Text wird _nicht_ in die Zwischenablage von Windows übertragen. Der markierte Bereich landet im Zwischenspeicher des RasPi!

    Geht man im Texteditor an eine andere Stelle, kann die Zwischenablage mittels Strg-V dort auch wieder eingefügt werden. Aber wechselt man auf dem Windows-Rechner in einen Texteditor, erhält man mit Strg-V nichts. Die lokale Zwischenablage ist ja leer, weil Strg-C in die Zwischenablage des RasPi kopiert hat.

    Eine Kopie aus der X-Session heraus ist erstmal so auf Anhieb, da es ja eine grafische Session ist, nur per Bildschirm-Foto (z.B. GreenShot) möglich. Dann hat man aber eben keinen Text, sondern nur ein Bild. (Das wäre bei SSH anders...)

    Wichtig zum Verständnis ist: Es wird nicht der markierte Bereich übertragen und in eine Zwischenablage kopiert. Es wird nur der Tastendruck Strg-C übertragen und dann auf dem entfernten Rechner der Bereich in die dortige Zwischenablage kopiert. Und dort bleibt es auch...

    Gruß, Michael

    Also die Bilder sollen in var/www gespeichert werden.


    Womit Du eigentlich /var/www meinst. Der führende / ist durchaus wichtig!


    Zitat

    Das Script liegt in home/pi/meinScript.sh


    Und entsprechend liegt das Script in /home/pi/meinScript.sh. Alternativ liegt es in ~/meinScript.sh, da ~ mit /home/<user> ersetzt wird.

    Zitat

    filename=/var/www/meinBild.jpg


    Das sieht allerdings erstmal korrekt aus. Aber...

    Hat Dein Script (bzw. der ausführende Benutzer) überhaupt Schreibrecht im www-Stammverzeichnis? Eventuell darf dort nur der Webserver oder root schreiben?

    Code
    pi@raspi1 /var $ ls -l www
    insgesamt 4
    drwxr-xr-x 9 root root 4096 Jan 23  2016 html

    d = directory (also ist's ein Verzeichnis)
    rwx für user root - root darf lesen, schreiben und ausführen
    r-x (kein w!) für gruppe root und other - die anderen dürfen nur lesen und ausführen.

    Gruß, Michael

    Moinsens!

    Ich bastel gerade an einer kleinen Tischuhr mit dem 7"-Touch-Display im passenden Gehäuse. Auf dem RasPi ist dazu ein Eclipse 3.8.1 installiert. Der Kalender / die analoge Uhr funktionieren soweit auch.
    [RasPi_Clock.png]

    Nun wollte ich das Ding um etwas Radio (streaming) erweitern. Der MPD / MPC laufen bereits auf dem RasPi und dort sind auch 10 Playlisten für meine Favoriten-Radios hinterlegt.

    [RasPi_MPC.png]

    Ich stieß auf die Bibliothek JavaMPD, mit der man den MPD steuern kann. Also hab ich den Download per git gemacht.

    [RasPi_JavaMPD_Download.png]

    Aber ich steh jetzt wie Ochs vor Berg bei dem Versuch, diesen Download innerhalb Eclipse benutzen zu können. Ich stelle mir vor, daß JavaMPD als Resource für dieses und weitere Projekte irgendwie global zur Verfügung stehen sollte. Aber ich find immer nur Hinweise, wie ich Packages in ein konkretes Projekt importieren kann. Und selbst das ist irgendwie hakelig.


    Konkret bin ich so weit, daß ich ein JRadioPanel vom JPanel abgeleitet habe. Dort möchte ich gerne

    Code
    private static MPD mpd = new MPD.Builder().build();


    in den Klassen-globalen Deklarationen einfügen. Aber klar, MPD ist nicht bekannt.

    [RasPi_JavaMPD_Eclipse.png]

    Welchen Ordner aus dem git-Clone muß ich jetzt wo in der Eclipse-Struktur unterbringen? Wie am besten - Kopieren, Import-Wizard, ... ? Und welche import-Zeile brauchts dann im JRadioPanel? Oder kriegt Eclipse das dann mit Strg-Shft-O automatisch gebacken?


    Die Frage ist jetzt zwar konkret auf JavaMPD bezogen, aber eigentlich ist das eine grundsätzliche Frage zu dem Thema. Bislang bin ich mit der (bereits automatisch installierten) JRE System Library ausgekommen. Aber es wird ja immer wieder mal die Möglichkeit geben, auf externe Resourcen zugreifen zu können. Da würde ich schon gerne mal so ganz grundsätzlich wissen, wie man das macht.

    Und ich nehm auch gerne Links auf Tutorial- oder HowTo-Seiten an. Ich hab nur einfach bislang mit Google nichts gefunden, was mir weiter hilft. Aber ich hab vielleicht auch einfach nur mit falschen Stichworten gesucht...

    Vielen Dank schonmal für eure Hilfe.

    Gruß, Michael