Я пытаюсь нарисовать изображение в терминале. Я могу напечатать текст и могу изменить фон. Пример минимальной работы:
import Xlib
import Xlib.display
import psutil
import cv2
from PIL import Image
# https://github.com/seebye/ueberzug/tree/master/ueberzug/xutils.py
def get_parent_pids(pid):
pids = []
process = psutil.Process(pid=pid)
while (process is not None and
process.pid > 1):
pids.append(process.pid)
process = process.parent()
return pids
pids = get_parent_pids(pid=psutil.Process().pid)
display = Xlib.display.Display()
screen = display.screen()
root = display.screen().root
window_ids = root.get_full_property(
display.intern_atom('_NET_CLIENT_LIST'),
Xlib.X.AnyPropertyType).value
for idx in window_ids:
window = display.create_resource_object('window', idx)
win_pid = window.get_full_property(display.intern_atom('_NET_WM_PID'),
Xlib.X.AnyPropertyType).value[0]
for pid in pids:
if win_pid == pid:
term = window
break
colormap = screen.default_colormap
window = term.create_window(0, 0, 640, 480, 1,
0, Xlib.X.InputOutput,
114,
background_pixel = colormap.alloc_named_color("white").pixel,
event_mask = Xlib.X.StructureNotifyMask | Xlib.X.ExposureMask)
window.map()
while True:
gc = window.create_gc(foreground=0, background=0)
window.draw_text(gc, 10, 50, 'Hello World')
display.flush()
Затем я пытаюсь нарисовать на нем изображение.
ret, frame = cap.read()
image = Image.fromarray(frame)
canvas = window.create_pixmap(image.width, image.height, 24)
canvas.put_pil_image(gc, 0, 0, image)
window.copy_area(gc, canvas, 0, 0, image.width, image.height, 0, 0)
Что дает мне;
X protocol error:
<class 'Xlib.error.BadMatch'>: code = 8, resource_id =
98566145, sequence_number = 323, major_opcode = 62, minor_opcode = 0
Я пробовал несколько вещей, включая изменение атрибутов окна, чтобы обмануть xlib и показать его как root окно. Я мог бы изменить ошибку на BadDrawable.
Я делаю что-то не так или невозможно сделать то, что я пытаюсь сделать, используя xlib?