Найти - Пользователи
Полная версия: Как в линукс опреледить тип содежимого буфера обмена?
Начало » Python для новичков » Как в линукс опреледить тип содежимого буфера обмена?
1
Rafik
В гугле ничего толкового не нашёл.
Есть такой скрипт под венду
 # -*- coding: utf-8 -*-
from tkinter import *
from PIL import Image, ImageGrab
from datetime import datetime
import win32clipboard
import hashlib
root = Tk()
root.title("Автозапись")
root.geometry("400x100+200+100")
lb = Label(root,
           text="Включено автоматическое сохранение графики из буфера обмена")
lb.pack(side=TOP,pady=10)
Button(root,text="Завершить",command=root.destroy).pack(side=BOTTOM,pady=10)
last_image = bytes(123)
def getClipboardFormats():
    "Сбор списка возможных форматов содержимого буфера обмена"
    win32clipboard.OpenClipboard()
    available_formats = []
    current_format = 0
    while True:
        # Читаем следующий формат
        current_format = win32clipboard.EnumClipboardFormats(current_format)
        # Все форматы исчерпаны, цикл прерываем
        if not current_format:
            break
        available_formats.append(current_format)
    win32clipboard.CloseClipboard()
    return available_formats
def grab_it():
    "Сохраняем снимок экрана в файл"
    global last_image
    im = ImageGrab.grabclipboard()
    # Флаг "текст". Устанавливается, если содержимое буфера поддерживает
    # текстовый формат. Calc при копировании таблицы(или ячейки) в буфер обмена
    # выдает поддержку "графических" форматов CF_BITMAP, CF_DIB, CF_DIBV5
    # Чтобы отделить Calc'овское содержимое от PrintScreen используем этот флаг.
    txt = 1 in getClipboardFormats()
    # Переводим в байтовую последовательность для сравнения
    #  со старым изображением
    if isinstance(im, Image.Image) and not txt:
        im1 = im.tobytes()
    else:
        im1 = None
    # Сохраняем в файл, только если свежая картинка в буфере И там графический
    #  формат И формат не поддерживает "текст"
    if isinstance(im, Image.Image) and im1 != last_image and not txt:
        last_image = im1
        # Название файла сгенерируем из текущих даты и времени
        fnm = "{}{}".format(str(datetime.now())[:19].replace(":","-"),".jpg")
        # print(fnm)
        im.save(fnm)
    # планировщик tkinter вызовет grab_it через 100мс
    root.after(100, grab_it)
grab_it() # Запуск процесса
root.mainloop()
Хотелось бы сколхозить что-то подобное для линукса. Мщжет быть кто сталкивался с задачей определения содержимого буфера обмена? Хочется отсеять данные из Calc. А так, можно было бы и без определения вида данных использовать этот скрипт.
AD0DE412
https://python.hotexamples.com/ru/examples/Tkinter/Tk/clipboard_get/python-tk-clipboard_get-method-examples.html
 def getClipboardText():
    from Tkinter import Tk
    r = Tk()
    r.withdraw()
    s = r.clipboard_get()
    r.destroy()
    return s
и по типам возможно ..
https://pypi.org/project/python-magic/
upd не вроде нет кхм .. жаль

Rafik
Наверное, надо будет поэксперементировать с gtk. Если попытка получить текст из буфера даст пустоту, то содержимое не текст или пусто. Не знаю, сработает или выдаст ошибку, т.к. с gtk не знаком почти от слова “совсем”.
Кстати, оказывается, ImageGrab.grabclipboard() под линем не работает. Придётся искать способы сохранения, полученного из буфера, в файл.
PEHDOM
в линуксе же есть xclip для этого, или интересует чистый пайтон? типа такого? https://gist.github.com/orschiro/8b9a1ddadb696c2b4587
AD0DE412
похоже мы немного друг друга не поняли (нужно мне более поробно все … об сказать)
tkinter захватывает содержимое буфера обмена в формате str()
т.е. захватывает текст (ну там путь к файлу, скопированый текст итд)
а при копировании например слоя в gimp вываливается с ошибкой
вопрос в том как вы собиратесь копировать графиику т.е. источник и формат этих данных
если файловая это система
то имея путь к файлу опредилить его тип можно в питоновских magic или mimetypes
все сложнее когда в буфере сырые данные тут magic не поможет
Rafik
PEHDOM, да, именно что-то наподобие этого, чтобы из буфера обмена скрипт автоматом сохранял только картинку, а остальные виды содержимого игнорил бы. В винде копия ячейки Calc воспринимается библиотекой win32clipboard как текст и как картинка. Для исключения такого мусора включена проверка на тип содержимого буфера “текст”.
Не могу сказать как обстоят дела в линуксе, вдруг там тоже такая картина.
AD0DE412, в скрипте, который я привёл, tkinter никак не св. язан с манипуляцией с буфером обмена. Проверка типа содержимого win32clipboard, а чтение и сохранение выполняет pillow.
Моя задача проста и тривиальна: проверить есть ли картинка в буфере, если таковая появилась и она новая, то автоматом кинуть её в файл с названием “Год-месяц-день час-минуты-секунды” в любом формате (jpeg,png,gif и т.д).
Скрипт нужен для автоматического сохранения снимков экрана или окна.
Rafik
Вот я дебил, на кой ляд колхозить что-то самому. Есть же шикарная штука для линукса: scrot называется. Ведь несколько лет назад сталкивался с этим самым scrot и тогда захотелось что-то подобное для венды. Вот тогда-то по кускам из интернета был собран скрипт, который я привёл в этой теме.
М-да, склероз никого не щадит.
AD0DE412
блин вам что скрины нужно было делать …
https://github.com/ponty/pyscreenshot
ImageGrab.grab() https://pillow.readthedocs.io/en/stable/reference/ImageGrab.html

ps еще ffmpeg может всякое
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB