Comment afficher un fichier image (PNG) dans une fenêtre simple?

9

J'ai un prototype que je dois montrer pour un projet RFID. J'ai le RFID (Parallax USB) qui fonctionne, et l'exemple de script Python (mon premier) affiche l'ID de la carte comme il est censé le ... problème, ce n'est pas une démo / prototype très convaincant.

Ce que j'aimerais pouvoir faire, c'est lancer mon application sur le pi et avoir un affichage PNG en quelque sorte. Nouvelle fenêtre, plein écran, etc. Ensuite, lorsqu'une carte est détectée par le Pi, elle permute l'image affichée (1.PNG pour 2.PNG, etc.).

Quel serait le moyen le plus pragmatique, le plus simple et le plus rapide pour que l’écran n’affiche qu’un fichier image?

Voici mon code qui génère la RFID:

#! /usr/bin/python
import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 2400, timeout=1) # replace '/dev/ttyUSB0' with your port

while True:
    response = ser.read(12)
    if response <> "":
        print "raw: " + str(response)
        print "hex: " + str(response[-8:])
        print "dec: " + str(int(response[-8:], 16))
    time.sleep(1)

ser.close()
Jeff
la source
Comment allez-vous exécuter votre application? Allez-vous utiliser une interface graphique ou simplement à partir d'un shell de ligne de commande?
HeatfanJohn
Je répondrais probablement "par tous les moyens possibles". Je suis ouvert à vraiment n'importe quelle solution. J'utilise LXDE, c'est donc définitivement une option. Je n'ai pas programmé depuis un moment, donc ça a été un défi amusant, et je ne suis pas encore blasé par "non, je ne peux pas ..." alors j'apprécie toutes les options. Je suis vraiment dans une sorte de "mode super exploratoire" et je me suis bien amusé à essayer toutes sortes de solutions en python.
Jeff

Réponses:

6

Si vous utilisez un environnement de bureau X11 tel que LXDE , vous pouvez accomplir cela en utilisant la logique de base présentée dans cet article .

Voici ce que j'ai trouvé pour basculer en affichant deux images attendant 30 secondes entre chaque commutateur. Vous devriez être en mesure d'insérer votre logique de commutation des images en fonction de ce que vous lisez à partir de votre capteur RFID.

displayImages.py

#!/usr/bin/python

# use a Tkinter label as a panel/frame with a background image
# note that Tkinter only reads gif and ppm images
# use the Python Image Library (PIL) for other image formats
# free from [url]http://www.pythonware.com/products/pil/index.htm[/url]
# give Tkinter a namespace to avoid conflicts with PIL
# (they both have a class named Image)

import Tkinter as tk
from PIL import Image, ImageTk
from Tkinter.ttk import Frame, Button, Style
import time

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.root.title('My Pictures')

        # pick an image file you have .bmp  .jpg  .gif.  .png
        # load the file and covert it to a Tkinter image object
        imageFile = "babyAce.jpg"
        self.image1 = ImageTk.PhotoImage(Image.open(imageFile))
        self.image2 = ImageTk.PhotoImage(Image.open("baby-marti.jpg"))

        # get the image size
        w = self.image1.width()
        h = self.image1.height()

        # position coordinates of root 'upper left corner'
        x = 0
        y = 0

        # make the root window the size of the image
        self.root.geometry("%dx%d+%d+%d" % (w, h, x, y))

        # root has no image argument, so use a label as a panel
        self.panel1 = tk.Label(self.root, image=self.image1)
        self.display = self.image1
        self.panel1.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)
        print "Display image1"
        self.root.after(30000, self.update_image)
        self.root.mainloop()

def update_image(self):
    if self.display == self.image1:
        self.panel1.configure(image=self.image2)
        print "Display image2"
        self.display = self.image2
    else:
        self.panel1.configure(image=self.image1)
        print "Display image1"
        self.display = self.image1
    self.root.after(30000, self.update_image)       # Set to call again in 30 seconds

def main():
    app = Example()

if __name__ == '__main__':
    main()

Vous devriez pouvoir le modifier pour attendre 1000 ms et tester votre état RFID pour déterminer l'image à afficher.

HeatfanJohn
la source
C'est génial. J'ai installé PIL, python-tk est déjà la dernière version, et j'ai renommé les fichiers image pour qu'ils correspondent à ceux que j'ai copiés dans le même répertoire que "window.py". Lorsque je l'exécute sous python avec python window.pyj'obtiens l'erreur: ImportError: cannot import name ImageTk creuser maintenant pour voir comment le dépanner.
Jeff
J'ai mis à jour le programme pour utiliser correctement tkinter en utilisant cet article comme référence.
HeatfanJohn
Je ne suis pas un utilisateur de python, j'ai donc approuvé l'approbation de la modification, mais quelqu'un a suggéré que ce from ttk importsoit le cas from Tkinter.ttk import- mais cela me semble également faux, je suppose que cela devrait l'être from tk import, car c'est le cas aspour Tkinter.
goldilocks
7

La baguette possède un module / méthode d'affichage .

Dans le terminal

$ python -m wand.display wandtests/assets/mona-lisa.jpg

Dans un script Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
EarthmeLon
la source
merci, c'est génial ... vous pouvez même changer l'image à la volée, donc c'est génial pour faire des animations simples aussi bien, ou des jeux, ou quoi que ce soit ...
Flash Thunder
2

Si vous souhaitez afficher une image à partir de la ligne de commande, vous pouvez utiliser le programme de la console "fbi" avec sudo apt-get install -y fbi

Ivoah
la source