Pimenu???

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Moin,

ich bin neu im Thema Raspberry Pi und habe für eine Umsetzung meiner Idee das Programm Pimenu gefunden. Meine Programmierkentnisse basieren noch auf dem C64 also schon etwas veraltet.
Ich habe das Problem, daß ich das Tool Pimenu nicht zum laufen bekomme.

Das Fenster öffnet sich wie gewünscht. Diverse Änderungen in der Yaml-Datei werden übernommen. Ich habe mich in der Py-Datei schon umgesehen, jedoch fehlen mir noch die Kenntnisse und langsam die Lust was zu suchen/finden.
Es scheint als ob die Sh-Datei nicht gestartet oder falsch ausgeführt wird. Denn:
Nach dem drücken auf einen Button erscheint der Schriftzug "Executing..." und nicht passiert. Alles bleibt so, bis ich das Py-Programm mit "kill" beende.

Kann mir jemand dabei helfen?

Hier die Pimenu.py:

Code: Alles auswählen

#!/usr/bin/python2
# -*- coding: utf-8 -*-
from math import sqrt, floor, ceil
import os
import subprocess
import yaml
import Tkconstants as TkC
from Tkinter import Tk, Frame, Button, Label, PhotoImage
import sys


class FlatButton(Button):
    def __init__(self, master=None, cnf={}, **kw):
        Button.__init__(self, master, cnf, **kw)
        # self.pack()
        self.config(
            compound=TkC.TOP,
            relief=TkC.FLAT,
            bd=0,
            bg="#b91d47",  # dark-red
            fg="white",
            activebackground="#b91d47",  # dark-red
            activeforeground="white",
            # height=118,
            #width=104,
            highlightthickness=0
        )

    def set_color(self, color):
        self.configure(
            bg=color,
            fg="white",
            activebackground=color,
            activeforeground="white"
        )


class PiMenu(Frame):
    doc = None
    framestack = []
    icons = {}
    path = ''

    def __init__(self, parent):
        Frame.__init__(self, parent, background="white")
        self.parent = parent
        self.pack(fill=TkC.BOTH, expand=1)

        self.path= os.path.dirname(os.path.realpath(sys.argv[0]))
        with open(self.path + '/pimenu.yaml', 'r') as f:
            self.doc = yaml.load(f)
        self.show_items(self.doc)

    def show_items(self, items, upper=[]):
        """
        Creates a new page on the stack, automatically adds a back button when there are
        pages on the stack already

        :param items: list the items to display
        :param upper: list previous levels' ids
        :return: None
        """
        num = 0

        # create a new frame
        wrap = Frame(self, bg="black")
        # when there were previous frames, hide the top one and add a back button for the new one
        if len(self.framestack):
            self.hide_top()
            back = FlatButton(
                wrap,
                text='Zurück',
                image=self.get_icon("arrow.left"),
                command=self.go_back,
            )
            back.set_color("#00a300")  # green
            back.grid(row=0, column=0, padx=1, pady=1, sticky=TkC.W + TkC.E + TkC.N + TkC.S)
            num += 1
        # add the new frame to the stack and display it
        self.framestack.append(wrap)
        self.show_top()

        # calculate tile distribution
        all = len(items) + num
        rows = floor(sqrt(all))
        cols = ceil(all / rows)

        # make cells autoscale
        for x in range(int(cols)):
            wrap.columnconfigure(x, weight=1)
        for y in range(int(rows)):
            wrap.rowconfigure(y, weight=1)

        # display all given buttons
        for item in items:
            act = upper + [item['name']]

            if 'icon' in item:
                image = self.get_icon(item['icon'])
            else:
                image = self.get_icon('scrabble.'+item['label'][0:1].lower())

            btn = FlatButton(
                wrap,
                text=item['label'],
                image=image
            )

            if 'items' in item:
                # this is a deeper level
                btn.configure(command=lambda act=act, item=item: self.show_items(item['items'], act), text=item['label']+'…')
                btn.set_color("#2b5797")  # dark-blue
            else:
                # this is an action
                btn.configure(command=lambda act=act: self.go_action(act), )

            if 'color' in item:
                btn.set_color(item['color'])

            # add buton to the grid
            btn.grid(
                row=int(floor(num / cols)),
                column=int(num % cols),
                padx=1,
                pady=1,
                sticky=TkC.W + TkC.E + TkC.N + TkC.S
            )
            num += 1

    def get_icon(self, name):
        """
        Loads the given icon and keeps a reference

        :param name: string
        :return:
        """
        if name in self.icons:
            return self.icons[name]

        ico = self.path + '/ico/' + name + '.gif'
        if not os.path.isfile(ico):
            ico = self.path + '/ico/cancel.gif'

        self.icons[name] = PhotoImage(file=ico)
        return self.icons[name]

    def hide_top(self):
        """
        hide the top page
        :return:
        """
        self.framestack[len(self.framestack) - 1].pack_forget()

    def show_top(self):
        """
        show the top page
        :return:
        """
        self.framestack[len(self.framestack) - 1].pack(fill=TkC.BOTH, expand=1)

    def destroy_top(self):
        """
        destroy the top page
        :return:
        """
        self.framestack[len(self.framestack) - 1].destroy()
        self.framestack.pop()

    def destroy_all(self):
        """
        destroy all pages except the first aka. go back to start
        :return:
        """
        while len(self.framestack) > 1:
            self.destroy_top()

    def go_action(self, actions):
        """
        execute the action script
        :param actions:
        :return:
        """
        # hide the menu and show a delay screen
        self.hide_top()
        delay = Frame(self, bg="#2d89ef")
        delay.pack(fill=TkC.BOTH, expand=1)
        label = Label(delay, text="Ich mach ja schon...", fg="white", bg="#2d89ef", font="Sans 20")
        label.pack(fill=TkC.BOTH, expand=1)
        self.parent.update()

        # excute shell script
        subprocess.call([self.path + '/pimenu.sh' , actions])

        # remove delay screen and show menu again
        delay.destroy()
        self.destroy_all()
        self.show_top()

    def go_back(self):
        """
        destroy the current frame and reshow the one below
        :return:
        """
        self.destroy_top()
        self.show_top()


def main():
    root = Tk()
    root.geometry("320x240")
    root.wm_title('PiMenu')
    if len(sys.argv) > 1 and sys.argv[1] == 'fs':
        root.wm_attributes('-fullscreen', True)
    app = PiMenu(root)
    root.mainloop()


if __name__ == '__main__':
    main()
Hier die pimenu.yaml:

Code: Alles auswählen

# Menu configuration
---
-
    name: "Menu"
    label: "Rocrail "
    color: "#0000FF"
    icon: "RocMen"
    items:
    -
        name: "rocan"
        label: "Rocrail Server AN"
        color: "#0E0EEE"
        icon: "RocAN"
    -
        name: "rocaus"
        label: "Rocrail Server AUS"
        color: "#EE0E0E"
        icon: "RocAUS"
-
    name: "down"
    label: "Herunterfahren"
    color: "#FF0000"
    icon: "radioactive"
-
    name: "sicher"
    label: "Sichern"
    color: "#770707"
    icon: "disk1"
-
    name: "konfi"
    label: "Einstellungen"
    color: "#707707"
    icon: "cogs1"
hier die pimenu.sh:

Code: Alles auswählen

#!/bin/bash
key=$(echo "$*" | awk 'NF>1{print $NF}')
case $key in
 rocan)
      echo -e "\a"
      sleep 10
    ;;
 rocaus)
      echo -e "\a"
      sleep 12
   ;;
 sicher)
      echo -e "\a"
      sleep 15
   ;;
 down)
      echo -e "\a"
      sudo reboot
   ;;
 '')
      sleep 20
   ;;
esac
sleep 1
Ich würde mich freuen, wenn mir jemand helfen könnte.


Gruß

Harald
Zuletzt geändert von Anonymous am Sonntag 5. März 2017, 09:09, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sensibelchen: Du hast anscheinend eine nicht funktionierende Version von pimenu gefunden. Was falsch ist, sagt Dir die Fehlerausgabe in der Konsole.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Moin,

Danke für eine Antwort. Jedoch verstehe ich sie nicht. Denn ich habe keine Fehlermeldung.
Wenn ich pimenu.py in den IDLE unter Windoof lade und starte, kommt eine Fehlermeldung, jedoch da läuft das Programm dann überhaupt nicht. Auf dem Raspi läuft die "Button"-Anzeige ja seht gut. (Ich habe da schon viel mit experimentiert). Aber bei der Auswahl einer Aktion, geht das Fenster in den Anzeigemodus "Executing.." (Oder wie ich es übersetzt habe: Ich mach ja schon...) über und nichts passiert weiter.
Wo sehe ich denn da eine Fehlermeldung?
BlackJack

@Sensibelchen: In dem Terminal wo Du das Programm gestartet hast, solltest Du eine Ausnahme bekommen. Ich bekomme da eine.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Okay, wie geschrieben bin ich Anfänger. Aber jetzt habe ich es begriffen.
Das Pimenu ist ein Grafikprogramm, welches unter X laufen muß. Im Terminal läuft es überhaupt nicht.

Ich mußte ein pimenu.Desktop mit folgenden Inhalt erstellen:

Code: Alles auswählen

[Desktop Entry]
Name=PiMenu
Comment=PiMenu
Exec=/home/pi/pimenu/pimenu.py
Icon=lxterminal
Terminal=false
MultipleArgs=false
Type=Application
StartupNotify=true
Über diesen starte ich es vom Desktop aus. Von da aus läuft es ohne Fehlermeldung.
Sorry, daß ich es vergessen hatte anzugeben. Als Windoofnutzer ist das ganze Linuxsystem mir neu.
BlackJack

@Sensibelchen: Das ist nicht das Problem das der Code hat. Natürlich kann man das auch von einer Konsole aus starten — innerhalb einer grafischen Umgebung oder mit entsprechend gesetzter DISPLAY-Umgebungsvariable. Und wenn man es in einer Konsole startet und sich dann bis zur Ausführung des Shell-Skripts durchklickt, dann wird man auf der Konsole die Fehlermeldung sehen die auch die *.desktop-Datei nicht löst.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Moin,

Okay, dies mag also möglich sein. Wie geschrieben, ist der Raspi (und Linux) für mich neu.
Was Du da schreibst, sagt mir nichts.
Zumindest hilft es mir absolut nicht weiter.
Und ich weiß einfach nicht, warum das Pimenu-Programm nicht läuft. D.h. wo mein Fehler ist.

@Sirius3: glaube ich eigentlich nicht. Oder gibt es noch eine andere Quelle als hier: https://github.com/splitbrain/pimenu


Ich dachte der Raspi wäre nicht ganz Benutzerunfreundlich. Tja, so kann man sich irren. Wer kein Administrator ist oder Programmierer ist, kommt wohl nicht zum Ziel.

In einem anderen Forum konnte mir auch keiner helfen.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sensibelchen: das liegt nicht am Betriebssystem sondern an Python, bzw. jeder Programmierumgebung, die Fehlermeldungen auf die Konsole schreibt. Was eine Konsole ist und wie man sie bedient, ist kein Hexenwerk und sollte jeder, der Programmieren will auch kennen.

Daneben bleibt noch mein erster Hinweis: benutze einfach eine aktuelle Version von pimenu, die den Fehler nicht enthält.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

@Sirius3: Okay, ich habe mich wohl mißverständlich ausgedrückt. Wenn ich programmieren wollen würde, dann würde ich den "Mist" den ich haben will selbst programmieren. Ich habe das Programm Pimenu gesehen und gedacht, daß ich mir das programmieren sparen kann. Und somit das vollständige erlernen einer Programmiersprache erspare. Der Raspi soll ein Werkzeug sein für eine spezielle Aufgabe. So viel Energie will ich da nicht rein stecken.
Wie schon mehrfach geschrieben ist es mir auch egal, warum eine Meldung nun so oder anders irgendwo auftaucht. Solange mir keiner erklärt, warum die sso ist und wo genau das Problem sein kann, fühle ich mich nur ver...scht.
Aber dann erst einmal gut.
Dein Hinweis mit der aktuellen Version war zwar nett, jedoch wieso beantwortest Du dann meine Frage nicht? Ich schrieb, wo ich meine Version her habe, wenn die "richtig" aktuelle Version wo anders zu finden ist, wieso teilst Du mir dies nicht mit??
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sensibelchen: dann schau doch mal, was bei Deiner Version anders ist, als bei der, die hinter Deinem Link liegt.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Hähh?? Was??? "Meine" Version ist die von dem Link, den ich gepostet habe. Was soll da anders sein?? Solltest Du einen Unterschied entdeckt haben kann ich nur meinen zuvor geschriebenen Text wiederholen.
BlackJack

@Sensibelchen: Die Version bei Github hat den Fehler nicht mehr der in Deinem Programm enthalten ist. Und die letzte Version wurde vor drei Jahren das letzte mal verändert. Ist das echt so lange her das Du das von dort geladen hast?
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Ich habe dies zuletzt (seit dem ich seit 6 Wochen dabei bin, bestimmt 10x geladen. Deshalb "Zuletzt") vor 3 Tagen dort heunter geladen.Da ich immer noch nicht weiß wo der Fehler ist, wie er daher kam, was er bewirkt, etc. und Vorallem, wie ich ihn beseitige kann ich nichts weiter dazu sagen.
Nur zum Hinweis. Um meinen ersten Beitragh zu schreiben habe ich zum Einfügen des Codes die Dateien vorher noch einmal herunter geladen und direkt in den Text kopiert.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sensibelchen: das kann nicht sein. Zumindest hast Du englische Texte in deutsche umgewandelt und falls das wirklich Deine Quelle war, in einer Zeile noch etwas kaputt gemacht. Was passiert, wenn Du einfach die Zip-Datei herunterlädst und das Programm startest?
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

@Sirius3:
Okay, Feinheiten.
Also:
Ich habe die Dateien herunter geladen, auf den Raspi kopiert, dort ausgeführt. Ging nicht.
Mit nano den Text geändert, da ich nicht davon ausgehe, daß die Änderung innerhalb von Anführungszeichen einen Code grundsätzlich ändert. Dann erneut ausgeführt. Kaine Änderung festgestellt nur, daß der Text nun deutsch ist. Dann habe ich halt Diese Dateien wieder vom Raspi zurück kopiert und hier eingestellt. Da habe ich sie wohl am schnellsten gefunden.
Einige Änderungen gibt es automatisch, so habe ich es festgestellt, denn Windoof kennt das Zeichen mit den 3 Punkten nicht und bei Umlauten macht er auch Müll, jedoch ist auf dem Raspi die original Datei (jetzt leicht verändert (halt deutscher)) und läuft halt nicht (noch nie)

Ich wußte nicht, daß es wichtig ist in welcher Reihenfolge ich etwas hin und her kopieren darf um keine oder gewünschte Änderungen zu erhalten.

darf ich die Datei denn mit einem Windoofrechner herunterladen oder erzeugt dies schon einen Fehler??
BlackJack

@Sensibelchen: Die Datei unterscheidet sich eben nicht nur in Texten in Anführungszeichen, sondern halt auch in einer Codezeile die im Original funktioniert und in Deinem Code zu einem Fehler führt. Und die Änderung dort kann nicht einfach durch kopieren passieren, da musst Du schon aktiv im Editor den Code geändert haben.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Moin,

ich habe gestern noch ein letztes mal mich aufraffen können und ein bißchen herumprobiert.

Also: ich habe die ZIP-Datei auf den Raspi geschickt. Dort mit Unzip entpackt. Die Desktopverlinkung erstellt und über VNC-Viewer gestartet und es machte was er sollte.
Endlich.
Jedoch, nach einem öffnen der Pimenu.py Datei (nichts weiter ändern) nur wieder abgespeichert erzeugt das gleiche Problem. Die Py-Datei und die Sh-Datei kann ich nur unter Geany ändern. Änderungen mit Abspeichern mit anderen (VNC-Seitigen) Programmen ergeben das gleiche Fehlergebnis. Die SH-Datei konnte ich auch über nano ändern.

So eine Wichtige Einschränkung wäre ja wohl wichtig den Leuten mitzuteilen. Einmal mit dem "falschen" Programm gespeichert, kein Unterschied in der Datei, von "Außen" auch keine Unterschiede zu sehen, aber läuft nicht mehr.

Mal sehen, was passiert, wenn ich jetzt das, was ich haben will ergänze ob es dann auch noch läuft.
BlackJack

@Sensibelchen: Das wäre eine wichtige Einschränkung wenn es sie denn so geben würde. Ich kann das nicht nachvollziehen und das muss ein Problem mit dem Programm sein mit dem Du die Datei öffnest und wieder speicherst. Wenn Du die Datei öffnest, nichts machst, sondern nur wieder speicherst, dann ändert sich ja ausser dem Datum der Datei nichts. Sollte sich dabei doch etwas inhaltliches ändern, dann ist das ein Problem mit dem Editor der da etwas ändert ohne das man etwas geändert hat.

Edit: Und die Änderung die Du gezeigt hat, wird ganz sicher von *keinem* Editor einfach so gemacht. Da muss ein Mensch getippt haben.
Sensibelchen
User
Beiträge: 16
Registriert: Samstag 4. März 2017, 22:44

Moin,


wie gesagt. ich habe die Zip-Datei auf den Raspi gespeichert und dort entpackt (diesmal nicht auf Windoof entpackt). Dann gestartet und lief. Dann die Sh-Datei geöffnet mit LibreOffice (vorgabe vom Raspi) eine Leerzeile eingefügt und wieder erntfernt. (dadurch will das Programm abspeichern.) Es fragt nur nach ob im Txt oder Utc8 (oder so ähnlich) Format. Egal welches ich wähle, der Fehler taucht auf.

Also ändere ich die Sh.Datei mit nano und die Py-Datei mit Geany, dann läuft zumindest das Menü wie es soll, jedoch werden absolut keine Befehle ausgeführt, die in die Sh-Datei eingebaut werden. selbst mkdir, rm, etc nicht.

Okay. Ich ziehe meinen letzten Satz zurück. Ich hatte in der Sh-Datei als Sprungpunkte den Eintrag für label aus der Yaml-Datei verwendet und nicht den für name.
Ich frage mich nur wofür es den Eintrag unter label überhaupt gibt??

Nagut. Zumindest läuft es jetzt bei mir. Wo, wie, weshalb der Fehler da war weiß ich zwar nicht, jedoch weiß ich, wie ich etwas ähnliches jetzt vermeiden kann.


Gruß

Harald
BlackJack

@Sensibelchen: Ähm, ja klar wenn man keinen Texteditor sondern eine Textverarbeitung verwendet, sollte man nicht zwingend erwarten dass das funktioniert. Das liegt dann aber daran das die Datei tatsächlich inhaltlich verändert wurde.

Edit: Der label-Eintrag wird als Text im Button verwendet und als Grundlage für den Icon-Dateinamen wenn es keinen icon-Eintrag gibt.
Antworten