Mar-07-2021, 04:54 PM
(This post was last modified: Mar-07-2021, 04:54 PM by NoahTheNerd.)
I'm trying to run a python program to display the screen on an SPI display. I'm on a Raspberry Pi 4 running Ubuntu. Before I run the script, I have to run the terminal command
export DISPLAY=:0 (set the DISPLAY variable)
xhost +
python3 /home/username/Desktop/SPI_Display.py >/home/username/Desktop/SPI.log 2>&1 & (run the script and send the output to a log file)
It works for about 140 frames, and then prints this:
Here's the script:
xhost +
(something to do with setting the display). To make it run at boot, I put the script in rc.local with the xhost command before it:export DISPLAY=:0 (set the DISPLAY variable)
xhost +
python3 /home/username/Desktop/SPI_Display.py >/home/username/Desktop/SPI.log 2>&1 & (run the script and send the output to a log file)
It works for about 140 frames, and then prints this:
Error:XIO: fatal IO error 0 (Success) on X server ":0" after 899 requests (899 known processed) with 0 events remaining.
There is no traceback, it just prints that and stops. What's wrong?Here's the script:
#!/usr/bin/python3 #imports from PIL import Image, ImageDraw, ImageGrab import os.path import time from Xlib import display import adafruit_rgb_display.st7789 as st7789 import digitalio import board import mss script_dir = os.path.dirname(os.path.abspath(__file__))#script path cursor_image = Image.open(os.path.join(script_dir, "cursor.png"))#get image for cursor cursor_image = cursor_image.resize(((int)(cursor_image.width / 5), (int)(cursor_image.height / 5)))#scale cursor image #set pins cs_pin = digitalio.DigitalInOut(board.CE0) dc_pin = digitalio.DigitalInOut(board.D25) reset_pin = digitalio.DigitalInOut(board.D24) BAUDRATE = 24000000 spi = board.SPI() #display disp = st7789.ST7789( spi, rotation=90, width=135, height=240, x_offset=53, y_offset=40, cs=cs_pin, dc=dc_pin, rst=reset_pin, baudrate=BAUDRATE ) def mmsGrab(): #gets screenshot with mss.mss() as sct: for _, monitor in enumerate(sct.monitors[1:], 1): # Get raw pixels from the screen sct_img = sct.grab(monitor) # Create the Image img = Image.frombytes("RGB", sct_img.size, sct_img.bgra, "raw", "BGRX") return(img) width = disp.height height = disp.width while True: start_time = time.time() image = mmsGrab()#grab screenshot #get cursor position cursor_data = display.Display().screen().root.query_pointer()._data cursor_pos = (cursor_data["root_x"], cursor_data["root_y"]) image.paste(cursor_image, cursor_pos, cursor_image) #add cursor to screenshot image = image.resize((240, 135)) #resize to display disp.image(image)#display image #print FPS print("FPS: ", 1.0 / (time.time() - start_time)) print("Display time: ", time.time() - start_time)