Jak wyświetlić plik obrazu (PNG) w prostym oknie?

9

Mam prototyp, który muszę pokazać w projekcie RFID. Mam RFID (Parallax USB), a przykładowy skrypt Pythona (mój pierwszy) wyświetla identyfikator karty tak, jak powinien ... Problem polega na tym, że nie jest to bardzo przekonująca wersja demo / prototyp.

To, co chciałbym móc zrobić, to uruchomić moją aplikację na pi i jakoś wyświetlić PNG. Nowe okno, pełny ekran itp. Następnie, gdy karta zostanie wykryta przez Pi, zamienia wyświetlany obraz (1.PNG dla 2.PNG itp.).

Jaki byłby najbardziej pragmatyczny, najłatwiejszy i najszybszy sposób, aby ekran wyświetlał tylko plik obrazu?

Oto mój kod, który wysyła 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
źródło
Jak będziesz uruchamiać aplikację? Czy będziesz używać GUI czy tylko z linii poleceń?
HeatfanJohn
Prawdopodobnie odpowiedziałbym „w każdy możliwy sposób”. Jestem otwarty na naprawdę każde rozwiązanie. Używam LXDE, więc jest to zdecydowanie opcja. Od jakiegoś czasu nie programowałem, więc było to zabawne wyzwanie i nie jestem jeszcze zmęczony „nie, nie mogę ...”, więc doceniam wszystkie opcje. Naprawdę jestem w rodzaju „super-eksploracyjnego trybu” i świetnie się bawię, próbując różnego rodzaju rozwiązań w pythonie.
Jeff

Odpowiedzi:

6

Jeśli używasz środowiska graficznego X11, takiego jak LXDE , możesz to zrobić, korzystając z podstawowej logiki przedstawionej w tym artykule .

Oto, co wymyśliłem, aby przełączyć wyświetlanie dwóch obrazów czekających 30 sekund między każdym przełącznikiem. Powinieneś być w stanie wstawić logikę do przełączania obrazów na podstawie tego, co czytasz z czujnika 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()

Powinieneś być w stanie to zmienić, aby poczekać 1000 ms i przetestować swój status RFID, aby określić, który obraz ma zostać wyświetlony.

Fan wentylatora John
źródło
To jest niesamowite. Zainstalowałem PIL, python-tk jest już najnowszą wersją i zmieniłem nazwy plików obrazów, aby pasowały do ​​tych, które skopiowałem do tego samego katalogu, co „window.py”. Kiedy uruchamiam go w Pythonie z, pojawia python window.pysię błąd: ImportError: cannot import name ImageTk Przekopuję go teraz, aby zobaczyć, jak go rozwiązać.
Jeff
Zaktualizowałem program, aby poprawnie używał tkintera, korzystając z tego artykułu jako odniesienia.
HeatfanJohn
Nie jestem użytkownikiem Pythona, więc przeszedłem do zatwierdzenia edycji, ale ktoś sugeruje, że tak from ttk importpowinno być from Tkinter.ttk import- ale to również wydaje mi się błędne, tak sądzę, że tak powinno być from tk import, ponieważ to jest po stronie asTkintera.
złotowłosa
7

Różdżka ma moduł / metodę wyświetlania .

W terminalu

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

W skrypcie Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
EarthmeLon
źródło
dziękuję, to świetnie ... możesz nawet zmieniać obraz w locie, więc świetnie nadaje się do robienia prostych animacji, gier, czy cokolwiek innego
Flash Thunder
2

Jeśli chcesz wyświetlić obraz z wiersza poleceń, możesz użyć programu konsoli „fbi” z sudo apt-get install -y fbi

Ivoah
źródło