Come posso visualizzare un file di immagine (PNG) in una semplice finestra?


9

Ho un prototipo che devo mostrare per un progetto RFID. Ho l'RFID (Parallax USB) funzionante e lo script Python di esempio (il mio primo) mostra l'ID della scheda proprio come dovrebbe ... il problema è che non è una demo / prototipo molto convincente.

Quello che mi piacerebbe poter fare è lanciare la mia applicazione sul pi e avere un display PNG in qualche modo. Nuova finestra, schermo intero, ecc. Quindi, quando una scheda viene rilevata dal Pi, cambierebbe l'immagine visualizzata (1.PNG per 2.PNG, ecc.).

Quale sarebbe il modo più pragmatico, più semplice e veloce per visualizzare lo schermo solo un file di immagine?

Ecco il mio codice che genera l'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()

Come eseguirai la tua applicazione? Utilizzerai una GUI o semplicemente da una shell della riga di comando?
Heatfan John,

Probabilmente risponderei, "in ogni modo possibile". Sono aperto a qualsiasi soluzione. Sto usando LXDE, quindi è sicuramente un'opzione. Non ho programmato per un po ', quindi è stata una sfida divertente, e non sono ancora stanco di "no, non posso ...", quindi apprezzo tutte le opzioni. Sono davvero in una sorta di "modalità super esplorativa" e mi sono divertito un mondo a provare tutte le soluzioni in Python.
Jeff,

Risposte:


6

Se stai utilizzando un ambiente desktop X11 come LXDE , puoi farlo utilizzando la logica di base mostrata in questo articolo .

Ecco cosa mi è venuto in mente per passare alla visualizzazione di due immagini in attesa di 30 secondi tra ogni interruttore. Dovresti essere in grado di inserire la tua logica per cambiare le immagini in base a ciò che leggi dal tuo sensore 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()

Dovresti essere in grado di modificarlo per attendere 1000 ms e testare lo stato RFID per determinare quale immagine visualizzare.


Questo è bellissimo. Ho installato PIL, python-tk è già l'ultima versione e ho rinominato i file di immagine in modo che corrispondano a quelli che ho copiato nella stessa directory di "window.py". Quando lo eseguo in Python con python window.pyottengo l'errore: ImportError: cannot import name ImageTk scavando attraverso di esso ora per vedere come risolverlo.
Jeff,

Ho aggiornato il programma per utilizzare correttamente tkinter usando questo articolo come riferimento.
Heatfan John

Non sono un utente Python, quindi ho rinunciato all'approvazione della modifica, ma qualcuno ha suggerito di from ttk importesserlo from Tkinter.ttk import, ma questo mi sembra anche sbagliato, suppongo che dovrebbe essere from tk import, dal momento che è asper Tkinter.
riccioli d'oro

7

Wand ha un modulo / metodo di visualizzazione .

Nel terminale

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

In uno script Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)

grazie, è fantastico ... puoi persino cambiare immagine al volo, quindi è ottimo anche per realizzare animazioni semplici, giochi, o altro ...
Flash Thunder

2

Se si desidera visualizzare un'immagine dalla riga di comando, è possibile utilizzare il programma console "fbi" con sudo apt-get install -y fbi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.