Как отобразить файл изображения (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, чтобы определить, какое изображение отображать.

HeatfanJohn
источник
Это круто. Я установил 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

Палочка имеет дисплейный модуль / метод .

В терминале

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

В скрипте Python

import wand
with Image(blob=file_data) as image:
    wand.display.display(IMAGE)
earthmeLon
источник
спасибо, это здорово ... вы даже можете изменить изображение на лету, поэтому оно отлично подходит для создания простых анимаций, а также игр или чего-то еще ...
Flash Thunder
2

Если вы хотите отобразить изображение из командной строки, вы можете использовать консольную программу "fbi" с sudo apt-get install -y fbi

Ivoah
источник