Autostart mit init-Skript: Python startet, TKinter geht nicht

  • Hallo,

    Ich konnte mein Python-Skript erfolgreich mit einem Init-Skript (/etc/init.d und dann mit update.rc angemeldet) starten, allerdings gehen die "Fenster" (also der GUI-Teil der Applikation) nicht auf, wenn sie aufgehen sollen (erstellt mit TKInter).

    Wenn ich das Skript mit /etc/profile starte, dann klappt das mit dem Öffnen des Fensters, nur leider wird das Python-Skript dann zwei Mal beim StartUp gestartet.

    Hat jemand eine Idee, warum der "GUI-Teil" meines Skripts nicht funktioniert, wenn ich es mit einem Init-Skript unter /etc/init.d starte? Danke schon mal!

  • Autostart mit init-Skript: Python startet, TKinter geht nicht? Schau mal ob du hier fündig wirst!

  • Danke für den Tipp! Werde mich da mal einlesen...

    In dem init-Skript starte ich eigentlich schon ein "start.sh"-Skript, dass als ersten Befehl ein "Sleep 20" hat, d.h. mein Python Skript wird 20 Sekunden nachdem das Init-Skript aufgerufen wird aufgerufen (start.sh wird in der init.d-Datei mit "&" aufgerufen, also eigentlich als "separater Thread", soweit ich das verstanden habe)... 20 Sekunden sollten also eigentlich ausreichen.

    Wann wird eigentlich die grafische Umgebung geladen? Erkennt der Raspberry Pi, dass ein HDMI-Kabel angeschlossen ist? Falls weder HDMI noch VPN verbunden ist, wird dann überhaupt eine grafische Oberfläche geladen?

  • Hi,

    Ich habe mir das Ganze nochmal durchgelesen und bin zu dem Schluss gekommen, dass das alles nicht ganz zu mir passt. Mein Skript muss auch laufen, wenn KEINE GUI vorhanden ist und kein Benutzer eingeloggt o.ä.

    Was ich nun also gemacht habe:


    • Mein Skript, das beim Booten gestartet wird (ich nenne es mal "StartSkript.py"), enthält nun KEINE GUI-Elemente mehr (z.B. Tkinter)
    • Wenn ich in meinem Skript, das keine GUI Elemente mehr enthält, eine MessageBox öffnen möchte, rufe ich einen subprocess (mit POpen) auf, der dann ein "MessageBox.py"-Skript startet und die Antwort per stdout/PIPE ausliest.


    Das funktioniert, wenn ich "StartSkript.py" über die Konsole starte.

    Leider funktioniert es immer noch nicht, wenn ich "StartSkript.py" beim hochfahren des Raspberry PI starte. Die "nicht GUI-Elemente" meines Programms funktionieren hervorragend. Sobald ich jedoch eine MessageBox öffnen will und das Skript "MessageBox.py" starte, ist keine MessageBox zu sehen. Wo ist diese MessageBox hin? Kann mir das jemand von euch erklären? Das wäre super!

    Also dass in dem Moment, wo ich MessageBox.py die GUI nicht geladen ist, kann definitv nicht mehr sein...

    Danke schon mal!
    Automatisch zusammengefügt:


    Versuch mal, an den Anfang Deines Skripts ein

    Code
    os.environ["DISPLAY"] = ":0"

    zu setzen.

    habe ich versucht... leider ohne Erfolg. Danke trotzdem!

    Einmal editiert, zuletzt von BigRed (12. Februar 2017 um 19:28)

  • Versuch doch mal, Dein MessageBox.py mit suprocess.check_output und Umleitung von stderr nach stdout aufzurufen und schau, ob das irgendwelche Fehlermeldungen wirft. Vielleicht geben die ja einen Hinweis für die Fehlersuche.

  • Hi,

    Danke für den Tipp! Ich hatte eigentlich schon auf Fehlerhandling geachtet, nur leider habe ich den stderr-Parameter nicht angegeben :no_sad:

    Falsch:

    Code
    (stdout, stderr) = subprocess.Popen(['sudo', '/usr/bin/python', 'MessageBox.py'], stdout=subprocess.PIPE).communicate()
    logger.info("Answer of message box is " + stdout)
    if stderr is not None:
     logger.info("Error of message box is " + stderr)
    else:
     logger.info("MessageBox closed without errors")

    Richtig:

    Code
    (stdout, stderr) = subprocess.Popen(['sudo', '/usr/bin/python', 'MessageBox.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    logger.info("Answer of message box is " + stdout)
    if stderr is not None:
     logger.info("Error of message box is " + stderr)
    else:
     logger.info("MessageBox closed without errors")

    Klar: Der Pfad für die MessageBox muss angegeben werden!!! (das war der Fehler)

    Nun bekomme ich jedoch einen neuen Fehler, mit dem ich nichts anfangen kann:

    Zitat


    no display name and no $DISPLAY environment variable


    und wenn ich os.environ["Display"] = ":0" eingebe, dann kommt folgender Fehler:

    Zitat


    couldn't connect to display ":0"

    Scheinbar reicht es nicht, einen subprocess aufzurufen, damit dieser sich dann die GUI "greift". Hat jemand eine Idee, welche Display-Environment-Variable er akzeptieren könnte? Danke schon mal!

  • Hi,

    Ich bin mir jetzt nicht mehr sicher, mit welchem Benutzer das Skript läuft.

    Ich starte durch ein init.d Skript mein python-Programm "Background.py" - das mache ich übrigens mit "sudo".
    "Background.py" wiederum ruft mit dem subprocess-befehl dann das Programm "MessageBox.py" auf. Das mache ich auch mit sudo. Also eigentlich mache ich alles mit "sudo".

    Wenn ich auf der Shell "echo $DISPLAY" eingebe, bekomme ich als Antwort: :0.0
    Wenn ich auf der Shell "sudo echo $DISPLAY" eingebe, bekomme ich die selbe Antwort. Also hat, so wie ich das verstanden habe, der Superuser auch das Display :0.0

  • Ich habe gerade versucht, die MessageBox vom subprocess-call aus mit

    Code
    sudo -u pi python MessageBox.py

    aufzurufen, weil der user "pi" an der GUI angemeldet ist. Bekomme leider wieder den Fehler mit der fehlenden Display-Environment-Variable...
    Automatisch zusammengefügt:
    Ich habe die Antwort!!! (Sorry für das viele Fragen!! :( )

    Ich muss folgende Environment-Variablen setzen (in MessageBox.py) damit es funktioniert:

    Code
    # Set Display Environment Variable
    os.environ["XAUTHORITY"] = "home/pi/.Xauthority"
    os.environ["DISPLAY"] = ":0.0"

    Vielen Dank für eure Zeit!

    Einmal editiert, zuletzt von BigRed (16. Februar 2017 um 21:17)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!