Создайте небольшой RAM-диск, который приятен и быстр и позволяет избежать износа на вашей SD-карте.Запишите это изображение и отобразите его с помощью feh
или аналогичного:
sudo mkdir -p /media/ramdisk
sudo mount -t tmpfs -o size=4M tmpfs /media/ramdisk
df /media/ramdisk
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 4096 0 4096 0% /media/ramdisk
Затем запустите скрипт Python, обновляющий ваши изображения.
Исходный скрипт может выглядеть следующим образом:
#!/bin/bash
# Create a couple of useful variables
MNTPNT="/media/ramdisk"
IMGNAM="$MNTPNT/image.ppm"
# Make ramdisk and mount
sudo mkdir -p /media/ramdisk 2> /dev/null
sudo mount -t tmpfs -o size=4M tmpfs /media/ramdisk 2> /dev/null
# Create initial empty image to display with ImageMagick or any other means
convert -size 800x600 xc:black -depth 8 "$IMGNAM"
# Get 'feh' started in "Slideshow mode" in the background
feh --title "Monitor" -D 0.5 "$IMGNAM" "$IMGNAM" &
# Now start Python script with image name
./monitor.py "$IMGNAM"
Тогда скрипт Python monitor.py
может выглядеть так:
#!/usr/bin/python3
import os, sys, time
from PIL import Image, ImageDraw
from random import randint
# Pick up parameters
filename = sys.argv[1]
# Create initial image and drawing handle
w, h = 800, 600
im = Image.new("RGB",(w,h),color=(0,0,0))
draw = ImageDraw.Draw(im)
# Create name of temp image in same directory
tmpnam = os.path.join(os.path.dirname(filename), "tmp.ppm")
# Now loop, updating the image 100 times
for i in range(100):
# Select random top-left and bottom-right corners for image
x0 = randint(0,w)
y0 = randint(0,h)
x1 = x0 + randint(10,250)
y1 = y0 + randint(10,250)
# Select a random colour and draw a rectangle
fill = (randint(0,255), randint(0,255), randint(0,255))
draw.rectangle([(x0,y0),(x1,y1)], fill=fill)
# Save image to a temporary file, then rename in one immutable operation...
# ... so that 'feh' cannot read a half-saved image
im.save(tmpnam)
os.rename(tmpnam,filename)
time.sleep(0.3)
По сути, все вашиПриложение должно сделать следующее:
while true:
... generate new image ...
im.save(tmpnam)
os.rename(tmpnam,filename)
Если вы удалите --title "monitor"
из команды feh
, вы увидите, что она просто перебирает список из 2 изображений, которые оба оказываются одинаковымиобраз.Изображения меняются каждые 0,5 секунды, без мигания.Вы можете изменить это, если хотите.Если вы не хотите, чтобы он непрерывно чередовался по двум причинам, вы можете значительно увеличить задержку и отправить SIGUSR1
до feh
(os.kill(pid, signal.SIGUSR1)
), чтобы он переключался при каждом обновлении изображения.