Я работаю с холстом в Tkinter и пытаюсь скопировать содержимое этого холста в буфер обмена.
Я могу решить эту проблему, создав файл, а затем скопироватьсодержимое этого файла в буфер обмена с помощью xclip -selection clipboard -t image/png -i temp_file.png
, но я хочу использовать вместо этого буфер, позволяющий пользователю копировать его непосредственно в буфер обмена, не касаясь файловой системы пользователя.
Для использования xclip
Входная функция, я требую дать имя файла, а не строку.Я могу обойти это с помощью echo / cat как cat temp_file.png < echo | xclip -selection clipboard -t image/png -i
или cat file_name.png | xclip -selection clipboard -t image/png -i
в bash-line.
Я успешно смог использовать буфер для хранения холста, например:
memory = io.BytesIO()
img.save(memory, format="png")
return memory
и может сохранить изображение в файл следующим образом:
img = pil.Image.open(memory)
img.save("file_name.png", format="png")
Насколько я понял, из документации пил, pil.Image.open
- это то же самое, что встроенная функция open()
.,Тем не менее, пытаясь использовать open () для чтения файла, он утверждает, что BytesIO не является допустимым файлом.Думаю, это не большая проблема.
Я могу прочитать содержимое буфера с помощью memory.getvalue()
, а затем удалить окружающие b'...'
с помощью [2: -1].Затем я заменяю все '
в строке на \'
, так что я могу заключить ее в одинарные кавычки, и в итоге получаю эхом указанную строку с командой, которую я использовал в файле ранее.* Вывод cat file_name.png
в значительной степени совпадает с выводом строки, которую я даю echo
в моем подпроцессе, но, похоже, следующее не делает эту работу за меня, так как мой буфер обмена остается нетронутым:
bash_cmd = f"echo -n {img_data} | xclip -selection clipboard -t image/png -i"
p = sp.Popen(bash_cmd, shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
но
bash_cmd = f"xclip -selection clipboard -t image/png -i file_name.png"
p = sp.Popen(bash_cmd, shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
работает.
tl; dr
Что я делаю не так?Я изменяю содержимое файла и создаю поврежденное изображение, которое затем копируется?
Как правильно вывести содержимое io.BufferIO
в буфер обмена (в основном в Unix / Linux, но такжев MacOS / Windows)?