[kivy] "XDG_RUNTIME_DIR not set" Wo muss ich das machen?
Verfasst: Samstag 1. Mai 2021, 22:39
Guten Abend,
ich habe mal wieder ein Problem. Ich habe ein Programm mit Kivy geschrieben und das lief die letzte Zeit auf einem Raspberry Pi 4 mit Raspberry OS with Desktop. Neulich bin ich über einen Artikel von "c't" gestolpert in dem stand, das Kivy einiges mit bringt um die GUI auch auf einem Betriebssystem ohne Desktop anzuzeigen. Ich hoffe ich habe das richtig verstanden. Hier der Artikel:
https://www.heise.de/select/ct/2017/7/1490629104678785
Habe mir also das Raspberry OS-lite installiert und lasse das Kivy-Programm bei einem Neustart mit einem Crontabeintrag starten. Der Eintrag sieht so aus:
Nach einem Neustart, startet meine Kivy GUI aber nicht. Der Log-Eintrag sieht so aus:
Mit erhalte ich
Könnt ihr mit bitte sagen wo ich Kivy das fehlende Verzeichnis mitteilen muss?
In dier 'config.ini' habe ich nichts gefunden. In der Kivy Dokumentation steht zwar was davon, wie man das 'envoronment' kontrollieren kann, aber ich weis nicht wie ich das auf meinen Fall anwenden muss. Das wäre hier beschrieben:
https://kivy.org/doc/stable/guide/environment.html
Ansonsten findet man schon einige Beiträge im Internet, mit denen bin ich auch so weit gekommen und habe einige andere Fehler beseitigen können. Nur die Lösung dazu habe ich nicht gefunden oder übersehen.
Zum Schluss noch der Code meines Kivy-Programms:
Über eure Hilfe wäre ich sehr dankbar.
Grüße
Dennis
ich habe mal wieder ein Problem. Ich habe ein Programm mit Kivy geschrieben und das lief die letzte Zeit auf einem Raspberry Pi 4 mit Raspberry OS with Desktop. Neulich bin ich über einen Artikel von "c't" gestolpert in dem stand, das Kivy einiges mit bringt um die GUI auch auf einem Betriebssystem ohne Desktop anzuzeigen. Ich hoffe ich habe das richtig verstanden. Hier der Artikel:
https://www.heise.de/select/ct/2017/7/1490629104678785
Habe mir also das Raspberry OS-lite installiert und lasse das Kivy-Programm bei einem Neustart mit einem Crontabeintrag starten. Der Eintrag sieht so aus:
Code: Alles auswählen
@reboot /home/pi/Python/MusicBox_GUI.py -c kivy:log_level:debug > /home/pi/musicbox.log 2>&1
Code: Alles auswählen
[INFO ] [Logger ] Record log in /home/pi/.kivy/logs/kivy_21-05-01_20.txt
[INFO ] [Kivy ] v2.1.0.dev0
[INFO ] [Kivy ] Installed at "/home/pi/.local/lib/python3.7/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0]
[INFO ] [Python ] Interpreter at "/usr/bin/python3"
[INFO ] [Logger ] Purge log fired. Processing...
[INFO ] [Logger ] Purge finished!
[INFO ] [Factory ] 189 symbols loaded
[DEBUG ] [Cache ] register <kv.resourcefind> with limit=None, timeout=60
[DEBUG ] [Cache ] register <kv.lang> with limit=None, timeout=None
[DEBUG ] [Cache ] register <kv.image> with limit=None, timeout=60
[DEBUG ] [Cache ] register <kv.atlas> with limit=None, timeout=None
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[DEBUG ] [Cache ] register <kv.texture> with limit=1000, timeout=60
[DEBUG ] [Cache ] register <kv.shader> with limit=1000, timeout=3600
[INFO ] [Window ] Provider: sdl2
error: XDG_RUNTIME_DIR not set in the environment.
* failed to add service - already in use?
Code: Alles auswählen
printenv | grep RUNTIME
Code: Alles auswählen
XDG_RUNTIME_DIR=/run/user/1000
In dier 'config.ini' habe ich nichts gefunden. In der Kivy Dokumentation steht zwar was davon, wie man das 'envoronment' kontrollieren kann, aber ich weis nicht wie ich das auf meinen Fall anwenden muss. Das wäre hier beschrieben:
https://kivy.org/doc/stable/guide/environment.html
Ansonsten findet man schon einige Beiträge im Internet, mit denen bin ich auch so weit gekommen und habe einige andere Fehler beseitigen können. Nur die Lösung dazu habe ich nicht gefunden oder übersehen.
Zum Schluss noch der Code meines Kivy-Programms:
Code: Alles auswählen
#!/usr/bin/env python3
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.dropdown import DropDown
from kivy.uix.slider import Slider
from kivy.uix.button import Button
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from InternetRadio import Radio
from MusicPlayer import PlaylistPlayer
from pathlib import Path
from time import sleep
from subprocess import run
from loguru import logger
RADIOSENDER_PATH = Path('/media/MusicBox/Senderliste.csv')
PLAYLIST_PATH = Path('/media/MusicBox/Playlist/')
class MainScreen(Screen):
pass
class RadioScreen(Screen):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.radiostation = Radio()
def create_radioplayer(self):
try:
for sender in self.radiostation.read_station(RADIOSENDER_PATH):
sender_button = Button(text=sender, size_hint_y=None, height=44)
sender_button.bind(on_release=lambda sender_button: self.ids.DropDownMenu.select(sender_button.text))
#
# Check to add only once the radiostation to DropDownMenu.
#
if self.ids.sender_button.text not in self.radiostation.read_station(RADIOSENDER_PATH):
self.ids.DropDownMenu.add_widget(sender_button)
else:
break
except Exception as e:
logger.exception(e)
def set_sender(self, sendername):
self.radiostation.switch_station(sendername)
def radio_play(self):
self.radiostation.play_music()
def radio_stop(self):
self.radiostation.radio_stop()
def set_volume(self, volume):
self.radiostation.set_volume(volume)
class PlaylistScreen(Screen):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.player = PlaylistPlayer()
def load_playlist(self):
#
# Check to add only once the playlistobjects to DropDownMenu.
#
try:
check_new_folder = Path(f"{PLAYLIST_PATH}/{self.ids.playlist_button.text}")
if not check_new_folder.is_dir():
for playlist in PLAYLIST_PATH.iterdir():
playlist_button = Button(text=playlist.name, size_hint_y=None, height=44)
playlist_button.bind(
on_release=lambda playlist_button:
self.ids.DropDownPlaylist.select(playlist_button.text)
)
self.ids.DropDownPlaylist.add_widget(playlist_button)
except Exception as e:
logger.exception(e)
def playlist_player(self, music_folder):
try:
music_path = Path(f"{PLAYLIST_PATH}/{music_folder}/")
self.player.add_playlist(music_path)
except Exception as e:
logger.exception(e)
def player_play(self):
try:
self.player.play()
except Exception as e:
logger.exception(e)
def player_next(self):
self.player.next()
def player_pause(self):
self.player.pause()
def player_previous(self):
self.player.previous()
def player_stop(self):
self.player.stop()
def player_volume(self, volume):
self.player.set_volume(volume)
class BluetoothScreen(Screen):
def bluetooth_on(self):
try:
run(['rfkill', 'unblock', 'bluetooth'], check=True)
sleep(0.5)
run(['sudo', 'systemctl', 'restart', 'bluetooth.service'], check=True)
except Exception as e:
logger.exception(e)
def bluetooth_off(self):
try:
run(['rfkill', 'block', 'bluetooth'], check=True)
except Exception as e:
logger.exception(e)
class ShutdownScreen(Screen):
def musicbox_off(self):
run(['sudo', 'shutdown', '-h', '0'], check=True)
class AnimWidget(Widget):
pass
class ImageButton(ButtonBehavior, Image):
pass
class VolumeSlider(Slider):
pass
class DropDownMenu(DropDown):
pass
class DropDownPlaylist(DropDown):
pass
kv = Builder.load_file("musicbox.kv")
class MusicBox(App):
def build(self):
screenmanager = ScreenManager()
screenmanager.add_widget(MainScreen(name='main'))
screenmanager.add_widget(RadioScreen(name='internetradio'))
screenmanager.add_widget(PlaylistScreen(name='playlist'))
screenmanager.add_widget(BluetoothScreen(name='bluetooth'))
screenmanager.add_widget(ShutdownScreen(name='shutdown'))
return screenmanager
def main():
logger.add("/home/pi/Python/MusicBox.log", format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}")
MusicBox().run()
if __name__ == '__main__':
main()
Grüße
Dennis