Como exibir um arquivo de imagem (PNG) em uma janela simples?

9

Eu tenho um protótipo que preciso mostrar para um projeto de RFID. Eu tenho o RFID (Parallax USB) funcionando, e o script Python de exemplo (meu primeiro) está exibindo o ID do cartão exatamente como deveria ... o problema é que não é um demo / protótipo muito atraente.

O que eu gostaria de poder fazer é iniciar meu aplicativo no pi e exibir um PNG de alguma forma. Nova janela, tela cheia, etc. Então, quando um cartão é detectado pelo Pi, ele troca a imagem que está sendo exibida (1.PNG por 2.PNG, etc).

Qual seria a maneira mais pragmática, fácil e rápida de exibir a tela apenas um arquivo de imagem?

Aqui está o meu código que gera o 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
fonte
Como você estará executando seu aplicativo? Você usará uma GUI ou apenas a partir de um shell de linha de comando?
precisa saber é o seguinte
Eu provavelmente responderia "da maneira que puder". Estou aberto a realmente qualquer solução. Estou usando o LXDE, por isso é definitivamente uma opção. Eu não programo há um tempo, por isso tem sido um desafio divertido, e ainda não estou cansado de "não, não posso ...", então aprecio todas e quaisquer opções. Estou realmente em uma espécie de "modo super exploratório" e tenho me divertido bastante tentando apenas todos os tipos de soluções em python.
Jeff

Respostas:

6

Se você estiver usando um ambiente de área de trabalho X11 como o LXDE , poderá fazer isso usando a lógica básica mostrada neste artigo .

Aqui está o que eu criei para alternar, exibindo duas imagens aguardando 30 segundos entre cada comutador. Você deve poder inserir sua lógica para alternar as imagens com base no que lê do seu 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()

Você deve poder modificá-lo para esperar 1000 ms e testar seu status de RFID para determinar qual imagem exibir.

HeatfanJohn
fonte
Isso é incrível. Eu instalei o PIL, o python-tk já é a versão mais recente e renomeei os arquivos de imagem para corresponder aos que eu copiei no mesmo diretório que "window.py". Quando o executo em python python window.py, recebo o erro: ImportError: cannot import name ImageTk Indo agora para ver como solucioná-lo.
Jeff
Atualizei o programa para usar corretamente o tkinter usando este artigo como referência.
HeatfanJohn
Como não sou usuário de python, passei a aprovar a edição, mas alguém sugeriu from ttk importque from Tkinter.ttk importsim - mas isso também me parece errado, meu palpite é que deve ser from tk import, já que esse é o ascaso do Tkinter.
goldilocks
7

O Wand possui um módulo / método de exibição .

No terminal

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

Em um script Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
earthmeLon
fonte
obrigado, que é grande ... você pode até mudar a imagem na mosca, por isso é ótimo para fazer animações simples aswell, ou jogos, ou qualquer outra coisa ...
o Flash Trovão
2

Se você deseja exibir uma imagem na linha de comando, pode usar o programa de console "fbi" com sudo apt-get install -y fbi

Ivoah
fonte