pythonclipboardkde-plasmakde4

How to put an image from python to klipper?


Using python, one can read in an image:

from PIL import Image, ImageTk
image = Image.open("test.jpg")

Then one can write to klipper in the following way:

import dbus
bus = dbus.SessionBus()
proxy = bus.get_object("org.kde.klipper","/klipper")
iface = dbus.Interface(proxy,"org.kde.klipper.klipper")
iface.setClipboardContents("text")

But when I try to write an image I just opened - it says it can't accept it:

iface.setClipboardContents(image)
TypeError: Expected a string or unicode object

So my question is: "how to put an image to klipper with python?"


Solution

  • Found some solution - not with python but with bash, and it doesn't work for remote pictures - works only for local ones (because of gwenview). Here is a bash script:

    #!/bin/bash
    cd /home/boris/Downloads/
    name=`ls -t1 | head -1`
    gwenview $name &
    sleep 3
    id=`ps -e | grep gwenview | awk '{print $1}'`
    qdbus org.kde.gwenview-$id /gwenview/MainWindow_1/actions/edit_copy trigger
    sleep 3
    kill $id
    

    This could also be done with python of cource, but since I make a system call, not read in a picture - there's no need to use python.

    To explain it - suppose You downloaded an image to ~/Downloads. Then if you the this script it will finds the freshest file in there, opens it with gwenview, copies it to clipboard (!), then closes gwenview.

    I think to work properly - no other gwen's could be running. And if You want to use it - it's wise to bind the script to a hotkey.

    The reason I was looking for such a script - is because I want to switch to keyboard-driven webbrowser (such as Conkeror or Pentadactyl) - and it allows to save image quickly - while I mostly need to paste it to some .odt file).

    This script can further be made a daemon - which will watch the Downloads dir. But now I to write a script which will download image, and put to clipboard automatically - please see my next question.

    The way to find qdbus command you might need - is to open

    qdbusviewer
    

    and find the app you need, then the command you need, and then make call similarly it's done to, e.g. lock the screen:

    qdbus org.kde.krunner /ScreenSaver Lock