如何在简单的窗口中显示图像文件(PNG)?


9

我已经为RFID项目展示了一个原型。我已经使RFID(视差USB)正常工作,并且示例Python脚本(我的第一个脚本)正在显示卡的ID,就像它应该那样...问题是,它不是一个非常引人注目的演示/原型。

我想做的就是在pi上启动我的应用程序,并以某种方式显示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()

您将如何运行您的应用程序?您将使用GUI还是仅从命令行Shell使用?
HeatfanJohn

我可能会回答:“我会尽力”。我愿意接受任何解决方案。我正在使用LXDE,因此绝对是一种选择。我已经有一段时间没有编程了,所以这是一个有趣的挑战,并且我还没有因为“不,我不能...”而感到厌烦,所以我很感激任何选择。我真的处于一种“超级探索性模式”,并且一直在尝试使用python解决各种问题。
杰夫

Answers:


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 现在浏览它以了解如何进行故障排除。
2014年

我更新了程序,以使用本文作为参考正确使用tkinter 。
Heatfan约翰

我不是python用户,所以我通过了编辑,但是有人建议from ttk import这样做from Tkinter.ttk import-但这也使我感到不对,我猜应该是from tk import,因为这是asTkinter的目的。
goldilocks

7

魔杖具有显示模块/方法

在终端

$ 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.