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()

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.


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)

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.