Wie zeige ich eine Bilddatei (PNG) in einem einfachen Fenster an?

9

Ich habe einen Prototyp, den ich für ein RFID-Projekt zeigen muss. Ich habe das RFID (Parallax USB) zum Laufen gebracht und das Beispiel-Python-Skript (mein erstes) zeigt die ID der Karte genau so an, wie es soll ... Das Problem ist, dass es keine sehr überzeugende Demo / Prototyp ist.

Ich würde gerne in der Lage sein, meine Anwendung auf dem Pi zu starten und irgendwie ein PNG-Display zu haben. Neues Fenster, Vollbild usw. Wenn eine Karte vom Pi erkannt wird, wird das angezeigte Bild ausgetauscht (1.PNG gegen 2.PNG usw.).

Was wäre der pragmatischste, einfachste und schnellste Weg, um auf dem Bildschirm nur eine Bilddatei anzuzeigen?

Hier ist mein Code, der die RFID ausgibt:

#! /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
quelle
Wie werden Sie Ihre Anwendung ausführen? Verwenden Sie eine grafische Benutzeroberfläche oder nur eine Befehlszeilen-Shell?
HeatfanJohn
Ich würde wahrscheinlich antworten: "Wie auch immer ich kann". Ich bin offen für wirklich jede Lösung. Ich benutze LXDE, also ist es definitiv eine Option. Ich habe seit einiger Zeit nicht mehr programmiert, daher war es eine lustige Herausforderung, und ich bin noch nicht erschöpft von "Nein, ich kann nicht ...", daher schätze ich alle Optionen. Ich bin wirklich in einer Art "Super-Erkundungsmodus" und hatte viel Spaß beim Ausprobieren aller möglichen Lösungen in Python.
Jeff

Antworten:

6

Wenn Sie eine X11-Desktopumgebung wie LXDE verwenden , können Sie dies mithilfe der in diesem Artikel gezeigten Grundlogik erreichen .

Hier ist, was ich mir ausgedacht habe, um zwei Bilder anzuzeigen, die 30 Sekunden zwischen jedem Wechsel warten. Sie sollten in der Lage sein, Ihre Logik zum Umschalten der Bilder basierend auf dem, was Sie von Ihrem RFID-Sensor gelesen haben, einzufügen.

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

Sie sollten dies ändern können, um 1000 ms zu warten und Ihren RFID-Status zu testen, um festzustellen, welches Bild angezeigt werden soll.

HeatfanJohn
quelle
Das ist fantastisch. Ich habe PIL installiert, python-tk ist bereits die neueste Version und habe die Bilddateien so umbenannt, dass sie mit denen übereinstimmen, die ich in dasselbe Verzeichnis wie "window.py" kopiert habe. Wenn ich es unter Python mit ausführe python window.py, wird folgende Fehlermeldung ImportError: cannot import name ImageTk angezeigt : Durchsuchen Sie es jetzt, um zu sehen, wie Sie Fehler beheben können.
Jeff
Ich habe das Programm aktualisiert, um tkinter ordnungsgemäß zu verwenden, wobei dieser Artikel als Referenz verwendet wurde.
HeatfanJohn
Ich bin kein Python Benutzer , damit ich über die Zustimmung zum Bearbeiten übergeben, aber jemand vorgeschlagen from ttk importsollte from Tkinter.ttk import- aber das scheint mir auch als falsch, meine Vermutung ist , sollte es sein from tk import, denn das ist das ist asfür Tkinter.
Goldlöckchen
7

Der Zauberstab hat ein Anzeigemodul / eine Anzeigemethode .

Im Terminal

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

In einem Python-Skript

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
ErdmeLon
quelle
danke, das ist großartig ... du kannst sogar das Bild im laufenden Betrieb ändern, also ist es großartig, um auch einfache Animationen oder Spiele oder was auch immer zu machen ...
Flash Thunder
2

Wenn Sie ein Bild über die Befehlszeile anzeigen möchten, können Sie das Konsolenprogramm "fbi" mit verwenden sudo apt-get install -y fbi

Ivoah
quelle