Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 19, 2021 16:34:38

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

В гугле ничего толкового не нашёл.
Есть такой скрипт под венду

 # -*- 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. А так, можно было бы и без определения вида данных использовать этот скрипт.

Офлайн

#2 Фев. 19, 2021 18:44:20

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

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 не вроде нет кхм .. жаль



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Фев. 19, 2021 19:04:50)

Офлайн

#3 Фев. 20, 2021 06:37:41

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

Наверное, надо будет поэксперементировать с gtk. Если попытка получить текст из буфера даст пустоту, то содержимое не текст или пусто. Не знаю, сработает или выдаст ошибку, т.к. с gtk не знаком почти от слова “совсем”.
Кстати, оказывается, ImageGrab.grabclipboard() под линем не работает. Придётся искать способы сохранения, полученного из буфера, в файл.

Офлайн

#4 Фев. 20, 2021 12:52:58

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

в линуксе же есть xclip для этого, или интересует чистый пайтон? типа такого? https://gist.github.com/orschiro/8b9a1ddadb696c2b4587



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 20, 2021 12:53:21)

Офлайн

#5 Фев. 20, 2021 15:01:37

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

похоже мы немного друг друга не поняли (нужно мне более поробно все … об сказать)
tkinter захватывает содержимое буфера обмена в формате str()
т.е. захватывает текст (ну там путь к файлу, скопированый текст итд)
а при копировании например слоя в gimp вываливается с ошибкой
вопрос в том как вы собиратесь копировать графиику т.е. источник и формат этих данных
если файловая это система
то имея путь к файлу опредилить его тип можно в питоновских magic или mimetypes
все сложнее когда в буфере сырые данные тут magic не поможет



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Фев. 20, 2021 15:35:00)

Офлайн

#6 Фев. 21, 2021 17:45:45

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

PEHDOM, да, именно что-то наподобие этого, чтобы из буфера обмена скрипт автоматом сохранял только картинку, а остальные виды содержимого игнорил бы. В винде копия ячейки Calc воспринимается библиотекой win32clipboard как текст и как картинка. Для исключения такого мусора включена проверка на тип содержимого буфера “текст”.
Не могу сказать как обстоят дела в линуксе, вдруг там тоже такая картина.
AD0DE412, в скрипте, который я привёл, tkinter никак не св. язан с манипуляцией с буфером обмена. Проверка типа содержимого win32clipboard, а чтение и сохранение выполняет pillow.
Моя задача проста и тривиальна: проверить есть ли картинка в буфере, если таковая появилась и она новая, то автоматом кинуть её в файл с названием “Год-месяц-день час-минуты-секунды” в любом формате (jpeg,png,gif и т.д).
Скрипт нужен для автоматического сохранения снимков экрана или окна.

Офлайн

#7 Фев. 22, 2021 09:18:29

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

Вот я дебил, на кой ляд колхозить что-то самому. Есть же шикарная штука для линукса: scrot называется. Ведь несколько лет назад сталкивался с этим самым scrot и тогда захотелось что-то подобное для венды. Вот тогда-то по кускам из интернета был собран скрипт, который я привёл в этой теме.
М-да, склероз никого не щадит.

Отредактировано Rafik (Фев. 22, 2021 09:19:43)

Офлайн

#8 Фев. 22, 2021 17:11:50

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как в линукс опреледить тип содежимого буфера обмена?

блин вам что скрины нужно было делать …
https://github.com/ponty/pyscreenshot
ImageGrab.grab() https://pillow.readthedocs.io/en/stable/reference/ImageGrab.html

ps еще ffmpeg может всякое



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Фев. 22, 2021 17:13:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version