Як відобразити файл зображення (PNG) у простому вікні?


9

У мене є прототип, який мені потрібно показати для проекту RFID. У мене RFID (Parallax USB) працює, і зразок сценарію Python (мій перший) відображає ідентифікатор карти так само, як і належить ... Проблема полягає в тому, що це не дуже переконливий демо / прототип.

Що я хотів би зробити, це запустити свою програму на пі та мати як-небудь дисплей PNG. Нове вікно, повний екран і т. Д. Потім, коли Pi виявить карту, вона підмінить зображення, яке відображається (1.PNG для 2.PNG тощо).

Який би був найпрагматичніший, найпростіший, найшвидший спосіб, щоб екран відображав лише файл зображення?

Ось мій код, який видає 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()

Як ви будете запускати свою заявку? Чи будете ви використовувати графічний інтерфейс або просто з оболонки командного рядка?
HeatfanJohn

Я, мабуть, відповів би "будь-яким чином можу". Я відкритий для дійсно будь-якого рішення. Я використовую LXDE, тому це, безумовно, варіант. Я не програмував деякий час, тому це було цікавим викликом, і я ще не збився з "ні я не можу ...", тому я ціную будь-які варіанти. Я справді в якомусь "супер дослідницькому режимі" і піддався вибуху, просто пробуючи всілякі рішення в python.
Джефф

Відповіді:


6

Якщо ви використовуєте робоче середовище X11, наприклад LXDE , це можна зробити за допомогою основної логіки, показаної в цій статті .

Ось що я придумав, щоб переключити між собою два зображення, що очікують 30 секунд між кожним перемикачем. Ви повинні мати змогу вставити свою логіку перемикання зображень на основі того, що ви читаєте з датчика 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()

Ви повинні мати змогу змінити це, щоб зачекати 1000 мс та перевірити стан RFID, щоб визначити, яке зображення потрібно відображати.


Це круто. Я встановив PIL, python-tk - це вже остання версія, і я перейменував файли зображень так, щоб вони відповідали тим, які я скопіював у той самий каталог, як "window.py". Коли я запускаю його під python, python window.pyя отримую помилку: ImportError: cannot import name ImageTk копаючи його зараз, щоб побачити, як його усунути.
Джефф

Я оновив програму, щоб правильно використовувати tkinter, використовуючи цю статтю в якості посилання.
HeatfanJohn

Я не користувач python, тому я перейшов до схвалення редагування, але хтось запропонував, що це from ttk importмає бути from Tkinter.ttk import- але це також вражає мене як неправильне, я гадаю, що це має бути from tk import, оскільки це asдля Tkinter.
золотинки

7

У Wand є модуль / метод відображення .

У терміналі

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

У сценарії Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)

дякую, це чудово ... Ви навіть можете змінити зображення на льоту, тому він чудово підходить для створення простих анімацій, або ігор, чи будь-чого іншого ...
Flash Thunder

2

Якщо ви хочете відобразити зображення з командного рядка, ви можете скористатися консольною програмою "fbi" sudo apt-get install -y fbi

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.