Рисование изображения в терминал с помощью Xlib - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь нарисовать изображение в терминале. Я могу напечатать текст и могу изменить фон. Пример минимальной работы:

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?

...