Bagaimana cara menampilkan file gambar (PNG) di jendela sederhana?

9

Saya punya prototipe yang perlu saya tunjukkan untuk proyek RFID. Saya membuat RFID (Parallax USB) berfungsi, dan contoh skrip Python (pertama saya) menampilkan ID kartu seperti seharusnya ... masalahnya adalah, itu bukan demo / prototipe yang sangat menarik.

Yang ingin saya lakukan adalah meluncurkan aplikasi saya di pi dan memiliki layar PNG. Jendela baru, layar penuh, dll. Kemudian, ketika kartu terdeteksi oleh Pi, itu akan menukar gambar yang ditampilkan (1.PNG untuk 2.PNG, dll).

Apa cara yang paling pragmatis, termudah, tercepat untuk membuat layar hanya menampilkan file gambar?

Ini kode saya yang menampilkan 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
sumber
Bagaimana Anda menjalankan aplikasi Anda? Apakah Anda akan menggunakan GUI atau hanya dari shell baris perintah?
HeatfanJohn
Saya mungkin akan menjawab, "apa pun yang saya bisa". Saya terbuka untuk solusi apa pun. Saya menggunakan LXDE, jadi ini jelas merupakan pilihan. Saya belum memprogram dalam beberapa saat, jadi ini merupakan tantangan yang menyenangkan, dan saya belum letih oleh "tidak, saya tidak bisa ..." jadi saya menghargai setiap dan semua opsi. Saya benar-benar dalam semacam "mode eksplorasi super" dan telah bersenang-senang hanya mencoba segala macam solusi dengan python.
Jeff

Jawaban:

6

Jika Anda menggunakan Lingkungan Desktop X11 seperti LXDE , maka Anda dapat melakukannya menggunakan logika dasar yang ditunjukkan dalam artikel ini .

Inilah yang saya buat untuk beralih menampilkan dua gambar menunggu 30 detik antara setiap saklar. Anda harus dapat memasukkan logika Anda untuk beralih gambar berdasarkan apa yang Anda baca dari sensor RFID Anda.

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

Anda harus dapat memodifikasi ini untuk menunggu 1000 ms dan menguji status RFID Anda untuk menentukan gambar yang akan ditampilkan.

HeatfanJohn
sumber
Ini luar biasa. Saya menginstal PIL, python-tk sudah merupakan versi terbaru, dan saya mengganti nama file gambar agar sesuai dengan yang saya salin ke direktori yang sama dengan "window.py". Ketika saya menjalankannya di bawah python dengan python window.pysaya mendapatkan kesalahan: ImportError: cannot import name ImageTk Menggali sekarang untuk melihat bagaimana memecahkan masalah itu.
Jeff
Saya memperbarui program untuk menggunakan tkinter dengan benar menggunakan artikel ini sebagai referensi.
HeatfanJohn
Saya bukan pengguna python jadi saya meneruskan menyetujui hasil edit, tetapi seseorang menyarankan from ttk importharus from Tkinter.ttk import- tetapi itu juga menurut saya salah, dugaan saya seharusnya from tk import, karena itu adalah asuntuk Tkinter.
goldilocks
7

Tongkat memiliki modul / metode tampilan .

Di terminal

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

Dalam skrip Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
earthmeLon
sumber
terima kasih, itu hebat ... Anda bahkan dapat mengubah gambar dengan cepat, sehingga sangat bagus untuk membuat animasi sederhana juga, atau game, atau apa pun ...
Flash Thunder
2

Jika Anda ingin menampilkan gambar dari baris perintah, Anda dapat menggunakan program konsol "fbi" dengan sudo apt-get install -y fbi

Ivoah
sumber