cut & paste text between tkinter widgets

W

William Gill

Is there a simple way to cut and paste from a tkinter text widget to an
entry widget? I know I could create a mouse button event that triggers
a popup (message widget) prompting for cut/paste in each of the widgets
using a temp variable to hold the text, but I don't wnat to reinvent the
wheel if there already is something that does the job.

Thanks,

Bill
 
C

Christopher Subich

William said:
Is there a simple way to cut and paste from a tkinter text widget to an
entry widget? I know I could create a mouse button event that triggers
a popup (message widget) prompting for cut/paste in each of the widgets
using a temp variable to hold the text, but I don't wnat to reinvent the
wheel if there already is something that does the job.

1) TKinter text and entry widgets should already have proper event
bindings for cut/copy/paste. Test first with your system-default
keyboard shortcuts (^C, ^X, ^V on Windows). I haven't tried it myself,
but I think those events bind to '<<Cut>>', '<<Copy>>', and '<<Paste>>',
so generating them should Do The Right Thing with selected text.

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]
 
W

William Gill

1) TKinter text and entry widgets should already have proper event
bindings for cut/copy/paste. Test first with your system-default
keyboard shortcuts (^C, ^X, ^V on Windows). I haven't tried it myself,
but I think those events bind to '<<Cut>>', '<<Copy>>', and '<<Paste>>',
so generating them should Do The Right Thing with selected text.

^C, ^X, and ^V work just fine! (I swear I tried that before I posted
and they didn't???)

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.

Thanks,

Bill
 
J

jepler

Here's some code that gives a cut-copy-paste pop-up window on all Entry widgets
in an application.

This code is released into the public domain.

Jeff Epler
#------------------------------------------------------------------------
import Tkinter

def make_menu(w):
global the_menu
the_menu = Tkinter.Menu(w, tearoff=0)
the_menu.add_command(label="Cut")
the_menu.add_command(label="Copy")
the_menu.add_command(label="Paste")

def show_menu(e):
w = e.widget
the_menu.entryconfigure("Cut",
command=lambda: w.event_generate("<<Cut>>"))
the_menu.entryconfigure("Copy",
command=lambda: w.event_generate("<<Copy>>"))
the_menu.entryconfigure("Paste",
command=lambda: w.event_generate("<<Paste>>"))
the_menu.tk.call("tk_popup", the_menu, e.x_root, e.y_root)

t = Tkinter.Tk()
make_menu(t)

e1 = Tkinter.Entry(); e1.pack()
e2 = Tkinter.Entry(); e2.pack()
e1.bind_class("Entry", "<Button-3><ButtonRelease-3>", show_menu)

t.mainloop()
#------------------------------------------------------------------------

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)

iD8DBQFC8T/iJd01MZaTXX0RAvRhAJ9nNGclYItSJp/PlHYJlbB+77CpDQCdE1xh
nIk5KAPLyOzut3KP5kdGO1U=
=45zY
-----END PGP SIGNATURE-----
 
C

Christopher Subich

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 said:
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.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:
functions
of Tk!')'I just love the wonderful clipboard management functions of Tk!'

And then, copying some text from this compose window...'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)
 
R

Repton

Christopher said:
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.
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.

You need to select something first :)
'foo'

e.selection_get() will raise TclError if the widget you call it on has
nothing selected.

I didn't know about this, though..
 
C

Christopher Subich

Repton said:
You need to select something first :)

That doesn't work for inter-process communication, though, at least not
with win32 native programs.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top