2017-08-23 2 views
0

Je transfère une application à un RPi, et j'ai besoin d'un moyen d'afficher les images en plein écran en utilisant python (3) pendant que le code continue à s'exécuter. Je voudrais éviter de plonger dans des modules GUI compliqués comme Tkinter et Pygame. Je veux juste que les images remplissent l'écran et restent là jusqu'à ce que le code les remplace ou leur dise de partir. Si Tkinter ou Pygame peuvent le faire, ce serait bien, mais il me semble qu'ils entrent tous deux dans des boucles qui nécessitent éventuellement une saisie au clavier. Mon application implique de monter des capteurs et des entrées externes, mais il n'y aura pas de clavier attaché. Je l'ai essayé ce qui suit:.Recherche d'un moyen simple d'afficher une image sur un RPi et continuer l'exécution de python

FEH activé avec subprocess.call (Cette affiche l'image, mais le code arrête jusqu'à ce que l'image est effacée par une combinaison de touches

wand.display (cela fonctionne, mais montre seulement une fenêtre assez petite, pas en plein écran)

fbi (n'a pas pu l'obtenir pour afficher une image)

XCD-ouvert (œuvres mais ouvre dans « image Viewer » app dans une petite fenêtre - aucune option pour plein écran sans un clic de souris)

Je n'ai pas essayé OpenCV. On dirait que cela pourrait fonctionner, mais c'est beaucoup d'infrastructure à apporter pour cette application simple.

Pour l'enregistrement, j'ai été à google et j'ai mis beaucoup d'heures dans cela. Cette demande est un dernier recours.

Si vous voulez un pseudo-code:

displayImage("/image_folder/image1.jpg" fullscreen = True) 
time.sleep(1) 
clearImage() 
displayImage("/image_folder/image2.jpg" fullscreen = True) 

Répondre

0

Vous ne montrez pas comment vous avez essayé avec FEH et un sous-processus, mais peut-être essayer de le démarrer en arrière-plan afin qu'il ne bloque pas votre thread principal:

subprocess.call("feh -F yourImage.jpg &", shell=True) 

Notez que les processus d'arrière-plan, à savoir ceux qui a commencé avec &, utilisent une caractéristique de la coquille, j'ai donc mis shell=True.

Ensuite, avant d'afficher l'image suivante, tuez l'instance précédente:

subprocess.call("pkill feh") 

Sinon, si vous connaissez les noms de toutes les images que vous prévoyez d'afficher à l'avance, vous pouvez commencer FEH en « mode diaporama » (en passant dans tous les noms d'image au démarrage), puis délivrer le signal SIGUSR1 chaque fois que vous voulez faire avancer l'image:

os.kill(os.getpid(...), signal.SIGUSR1) 

Si cela ne fonctionne pas, s'il vous plaît cliquer edit sous votre question initiale et ajouter la sortie des commandes suivantes afin que nous puissions aller dans le framebuffer:

fbset -fb /dev/fb0 

tvservice -d edid 
edidparser edid