¿Cómo visualizo un archivo de imagen (PNG) en una ventana simple?

9

Tengo un prototipo que necesito mostrar para un proyecto RFID. Tengo el RFID (Parallax USB) funcionando, y el script de Python de muestra (el primero) muestra la identificación de la tarjeta como se supone que debe ... el problema es que no es una demostración / prototipo muy convincente.

Lo que me encantaría poder hacer es iniciar mi aplicación en el pi y tener una pantalla PNG de alguna manera. Nueva ventana, pantalla completa, etc. Luego, cuando el Pi detecta una tarjeta, intercambia la imagen que se muestra (1.PNG por 2.PNG, etc.).

¿Cuál sería la forma más pragmática, fácil y rápida de hacer que la pantalla muestre solo un archivo de imagen?

Aquí está mi código que genera 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
fuente
¿Cómo ejecutará su aplicación? ¿Utilizará una GUI o solo desde un shell de línea de comando?
HeatfanJohn
Probablemente respondería, "de cualquier forma que pueda". Estoy abierto a realmente cualquier solución. Estoy usando LXDE, por lo que definitivamente es una opción. No he programado en mucho tiempo, así que ha sido un desafío divertido, y todavía no estoy cansado de "no, no puedo ...", así que aprecio todas y cada una de las opciones. Realmente estoy en una especie de "modo súper exploratorio" y me he estado divirtiendo probando todo tipo de soluciones en Python.
Jeff

Respuestas:

6

Si está utilizando un entorno de escritorio X11 como LXDE , puede hacerlo utilizando la lógica básica que se muestra en este artículo .

Esto es lo que se me ocurrió para cambiar la visualización de dos imágenes que esperan 30 segundos entre cada cambio. Debería poder insertar su lógica para cambiar las imágenes según lo que leyó de su sensor 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()

Debería poder modificar esto para esperar 1000 ms y probar su estado de RFID para determinar qué imagen mostrar.

HeatfanJohn
fuente
Esto es asombroso Instalé PIL, python-tk ya es la última versión, y cambié el nombre de los archivos de imagen para que coincidan con los que copié en el mismo directorio que "window.py". Cuando lo ejecuto en Python con aparece python window.pyel error: ImportError: cannot import name ImageTk Excavando ahora para ver cómo solucionarlo.
Jeff
Actualicé el programa para usar correctamente tkinter usando este artículo como referencia.
HeatfanJohn
No soy un usuario de Python, así que aprobé la edición, pero alguien sugirió que from ttk importdebería serlo from Tkinter.ttk import, pero eso también me parece erróneo, supongo que debería serlo from tk import, ya que es aspara Tkinter.
Ricitos de oro
7

Wand tiene un módulo / método de visualización .

En la terminal

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

En un script de Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
earthmeLon
fuente
gracias, eso es genial ... incluso puedes cambiar la imagen sobre la marcha, por lo que también es genial para hacer animaciones simples, o juegos, o lo que sea ...
Flash Thunder
2

Si desea mostrar una imagen desde la línea de comandos, puede usar el programa de consola "fbi" con sudo apt-get install -y fbi

Ivoah
fuente