Làm cách nào để hiển thị tệp hình ảnh (PNG) trong một cửa sổ đơn giản?


9

Tôi đã có một nguyên mẫu tôi cần hiển thị cho một dự án RFID. Tôi đã có RFID (Parallax USB) hoạt động và tập lệnh Python mẫu (lần đầu tiên của tôi) đang hiển thị ID của thẻ giống như nó được cho là ... vấn đề là, nó không phải là một bản demo / nguyên mẫu rất hấp dẫn.

Những gì tôi muốn có thể làm là khởi chạy ứng dụng của tôi trên pi và bằng cách nào đó có màn hình PNG. Cửa sổ mới, toàn màn hình, v.v ... Sau đó, khi Pi được phát hiện thẻ, nó sẽ hoán đổi hình ảnh được hiển thị (1.PNG cho 2.PNG, v.v.).

Điều gì sẽ là cách thực tế nhất, dễ nhất, nhanh nhất để màn hình chỉ hiển thị một tập tin hình ảnh?

Đây là mã của tôi tạo ra 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()

Làm thế nào bạn sẽ chạy ứng dụng của bạn? Bạn sẽ sử dụng GUI hay chỉ từ shell dòng lệnh?
HeatfanJohn

Tôi có thể sẽ trả lời, "bất cứ cách nào tôi có thể". Tôi đang mở cho bất kỳ giải pháp. Tôi đang sử dụng LXDE, vì vậy đây chắc chắn là một lựa chọn. Tôi đã không lập trình trong một thời gian, vì vậy đó là một thử thách thú vị và tôi chưa bị làm phiền bởi "không tôi không thể ..." vì vậy tôi đánh giá cao bất kỳ và tất cả các tùy chọn. Tôi thực sự đang ở trong một "chế độ siêu khám phá" và đã có một vụ nổ chỉ cần thử tất cả các loại giải pháp trong trăn.
Jeff

Câu trả lời:


6

Nếu bạn đang sử dụng Môi trường máy tính để bàn X11 như LXDE , thì bạn có thể thực hiện việc này bằng logic cơ bản được hiển thị trong bài viết này .

Đây là những gì tôi nghĩ ra để chuyển đổi hiển thị hai hình ảnh chờ 30 giây giữa mỗi công tắc. Bạn sẽ có thể chèn logic của mình để chuyển đổi hình ảnh dựa trên những gì bạn đọc được từ cảm biến 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()

Bạn sẽ có thể sửa đổi điều này để chờ 1000 ms và kiểm tra trạng thái RFID của bạn để xác định hình ảnh nào sẽ hiển thị.


Điều này thật tuyệt. Tôi đã cài đặt PIL, python-tk đã là phiên bản mới nhất và tôi đã đổi tên các tệp hình ảnh để khớp với các tệp tôi đã sao chép vào cùng thư mục là "window.py". Khi tôi chạy nó dưới python, python window.pytôi gặp lỗi: ImportError: cannot import name ImageTk Đào qua nó ngay bây giờ để xem cách khắc phục sự cố.
Jeff

Tôi đã cập nhật chương trình để sử dụng tkinter đúng cách sử dụng bài viết này làm tài liệu tham khảo.
HeatfanJohn

Tôi không phải là người dùng python nên tôi đã chấp thuận chỉnh sửa, nhưng ai đó đã đề xuất from ttk importnên from Tkinter.ttk import- nhưng điều đó cũng gây cho tôi là sai, tôi đoán là như vậy from tk import, vì đó là ascho Tkinter.
goldilocks

7

Wand có một mô-đun / phương pháp hiển thị .

Trong nhà ga

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

Trong tập lệnh Python

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

cảm ơn bạn, điều đó thật tuyệt ... bạn thậm chí có thể thay đổi hình ảnh một cách nhanh chóng, vì vậy thật tuyệt vời khi thực hiện các hoạt hình đơn giản, hoặc trò chơi, hoặc bất cứ điều gì ...
Flash Thunder

2

Nếu bạn muốn hiển thị hình ảnh từ dòng lệnh, bạn có thể sử dụng chương trình bảng điều khiển "fbi" với sudo apt-get install -y fbi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.