cut & paste text between tkinter widgets

Christopher Subich spam.csubich+block at block.subich.spam.com
Thu Aug 4 03:15:29 CEST 2005


Apologies in advance to anyone who has this post mangled, I use a couple 
Unicode characters at the end and Thunderbird wants to use UTF8 for the 
message encoding.  Unless it does something weird, this post should 
still be legible... but I'm not going to rely on that. :)

William Gill wrote:
>> 2) If you need to do any processing on the clipboard data, look at 
>> widget.selection_get [so named because of the way that X handles its 
>> clipboard]
> 
>  From my reading, w.selection_get will return the selected text in w, 
> and  places it on the clipboard.   I didn't see any way to get data from 
> the clipboard.

Not exactly.  The docs for selection_get say:

"""Return the contents of the current X selection.

A keyword parameter selection specifies the name of
the selection and defaults to PRIMARY.  A keyword
parameter displayof specifies a widget on the display
to use."""

The "X selection" is another way of saying "clipboard," again because of 
the way that X manages the clipboard.

In experimenting with this, I found a slight... fun issue involved in 
this.  Selection_get is the correct method to call, but it doesn't quite 
work out of the box.
 >>> g.selection_get()
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "C:\Python24\Lib\lib-tk\Tkinter.py", line 574, in selection_get
     return self.tk.call(('selection', 'get') + self._options(kw))
_tkinter.TclError: PRIMARY selection doesn't exist or form "STRING" not 
defined

This poses a small problem.  I'm not sure whether this is a 
Win32-related issue, or it's because the PRIMARY selection isn't fully 
configured.  Regardless, even if it worked it still wouldn't be what we 
wanted; the selection we want is CLIPBOARD.  See this code:

 >>> g.clipboard_clear()
 >>> g.clipboard_append('I just love the wonderful clipboard management 
functions
  of Tk!')
 >>> g.selection_get(selection='CLIPBOARD')
'I just love the wonderful clipboard management functions of Tk!'

And then, copying some text from this compose window...
 >>> g.selection_get(selection='CLIPBOARD')
'And then, copying some text from this compose window...'

In theory, the clipboard will support more than text.  This support is 
nontrivial, which is code for saying that I have no idea how to get it 
to work.

Also, despite ICCCM standards, it looks like this clipboard management 
on win32 works as-is with unicode data -- under Tkinter, it returns a 
unicode string. (α β γ δ -- and good luck with -that- going through 
unmangled)



More information about the Python-list mailing list