Tkinter per Crontab starten

  • Hallo zusammen,


    ich möchte testweise ein einfaches Tkinter-Programm automatisch beim Hochfahren des Raspberrys starten lassen. Das sehr simple Skript:

    Python
    from tkinter import *
    window = Tk()
    window.title("Testfenster")
    window.mainloop()


    Per F5 in der Python IDLE oder auch im Terminal per "python3 /home/pi/Python/tkintertest.py" lässt es sich problemlos starten.


    Dann habe ich einen neuen Cronjob mittels "crontab -e" erstellt: "@reboot python3 /home/pi/Python/tkintertest.py"


    Doch beim Hochfahren des Raspberrys erscheint kein Fenster :(


    Kann es daran liegen, weil ich auf den Raspberry über VNC zugreife und somit kein Bildschirm angeschlossen ist?


    Ich habe schon das Internet durchforstet und bin zu keiner zufriedenstellenden Antwort gekommen.


    Ich hoffe, ihr könnt mir helfen :)


    Grüße

    Michael

  • Hallo,


    bitteschön  :thumbup:


    Grüße

    Dennis


    Edit: Bitte verwende keine *-Importe. Dadurch holst du dir alle Namen des Moduls in deinen Namensraum. Das kann zu Namenskollisionen und Fehler in deinem Programm führen. Wenn es dir zu viel Schreibarbeit ist, kannst du 'tkinter' umbenennen. Üblicherweise in 'tk'.


    Code
    import tkinter as tk
    window = tk.Tk()
    window.title("Testfenster")
    window.mainloop()

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Wirklich vielen Dank euch beiden ^^

    Es funktioniert!


    Eine Frage noch zu *.desktop-Dateien:


    Man kann damit doch auch "normale" Python-Programme starten lassen, oder? Inwiefern unterscheidet sich das dann zum Cronjob – gibt es Vorteile oder Nachteile?

    • Official Post

    Man kann damit doch auch "normale" Python-Programme starten lassen, oder?

    Könnte man, aber das ist nur sinnvoll, wenn man ein Teminalfenster haben will, in dem das Skript laufen soll. *.desktop-Dateien sind also nur für Software mit GUI gedacht. Ohne GUI empfiehlt sich eine Systemd Service Unit oder ggf. ein Cronjob.


    Inwiefern unterscheidet sich das dann zum Cronjob – gibt es Vorteile oder Nachteile?

    *.desktop-Dateien werden erst geladen, wenn der Desktop "oben" ist. Ausserdem wird die Software nur für den User geladen, in dessen autostart-Verzeichnis die *.desktop-Datei liegt. Mit einem Cronjob lässt sich zwar auch ein Program mit GUI starten, aber dann nur "unkontrolliert", was Zeitpunkt und User angeht.

  • Ok, danke.

    Ich steuere nämlich den Lüfter des Raspberrys über Python, sodass der Lüfter um 22 Uhr ausgeschaltet wird. Mithilfe einer Tkinter-GUI will ich einen Button erstellen, mit dem man den Lüfter temporär ausschalten kann. Dementsprechend wird der Tkinter-Teil in der "normalen" Python-Datei sein, die den Lüfter steuert, weshalb eben auch der Lüfter-Code über die *.desktop-Datei gestartet werden muss....

    Deshalb die Frage vorher ;)


    Warum funktionierte die GUI mit einem Cronjob eigentlich nicht?

    • Official Post

    Das funktioniert schon wenn man dem Job sagt, auf welcher Anzeige die Software gestartet werden soll. Bei Dir z.B. wenn Du zwischen @reboot und python3 das DISPLAY=:0 einfügst,

    aber ohne einem sleep kommst Du da nicht aus, weil zu diesem Zeitpunkt der Desktop ja noch nicht steht. Wie bereits geschrieben ist es so unkontrolliertes starten des Skripts.

  • Achso ok, danke vielmals :thumbup:


    EDIT:

    Hab es jetzt auch mit sleep geschafft: @reboot sleep 60 && DISPLAY=:0 python3 /home/pi/Python/tkintertest.py

    Edited once, last by Arcturus ().