Reputation: 24240
In python's tkinter interface, is there a configuration option that will change a Label such that you can select the text in the Label and then copy it to the clipboard?
How would you modify this "hello world" app to provide such functionality?
from Tkinter import *
master = Tk()
w = Label(master, text="Hello, world!")
w.pack()
mainloop()
Upvotes: 31
Views: 35237
Reputation: 982
The other answers insert text to the text box instead of replacing the text. That works when you need to change the text only for one time. However, you need to delete the line first if you need to replace it. The following code would fix this issue:
from tkinter import *
master = Tk()
w = Text(master, height=1)
w.delete(1.0, "end")
w.insert(1.0, "Hello, world!")
w.pack()
# if tkinter is 8.5 or above you'll want the selection background
# to appear like it does when the widget is activated
# comment this out for older versions of Tkinter
w.configure(bg=master.cget('bg'), relief="flat")
w.configure(state="disabled")
mainloop()
Upvotes: 0
Reputation: 93
Tried Bryan Oakley's answer. Able to select the text but couldn't copy it to clipboard. Here is a workaround.
from Tkinter import *
def focusText(event):
w.config(state='normal')
w.focus()
w.config(state='disabled')
master = Tk()
w = Text(master, height=1, borderwidth=0)
w.insert(1.0, "Hello, world!")
w.pack()
w.configure(state="disabled")
w.bind('<Button-1>', focusText)
mainloop()
We could not copy the text unless the widget gets focused. We are anyway gonna use the mouse button1 (left-click) to select the text, so binding it to a function which enables the text widget, sets focus on it, then disables it again.
Upvotes: 4
Reputation: 51
Made some changes to the above code:
from tkinter import *
master = Tk()
w = Text(master, height=1)
w.insert(1.0, "Hello, world!")
w.pack()
# if tkinter is 8.5 or above you'll want the selection background
# to appear like it does when the widget is activated
# comment this out for older versions of Tkinter
w.configure(bg=master.cget('bg'), relief="flat")
w.configure(state="disabled")
mainloop()
The relief needs to be flat in order for it to look like an ordinary part of the display. :)
Upvotes: 5
Reputation: 1035
You can make texts which are selectable using either Text
or Entry
I really find both useful, using text can be really helpful! Here I show you a code of Entry:
from tkinter import *
root = Tk()
data_string = StringVar()
data_string.set("Hello World! But, Wait!!! You Can Select Me :)")
ent = Entry(root,textvariable=data_string,fg="black",bg="white",bd=0,state="readonly")
ent.pack()
root.mainloop()
Upvotes: 6
Reputation: 386220
The easiest way is to use a disabled text widget with a height of 1 line:
from Tkinter import *
master = Tk()
w = Text(master, height=1, borderwidth=0)
w.insert(1.0, "Hello, world!")
w.pack()
w.configure(state="disabled")
# if tkinter is 8.5 or above you'll want the selection background
# to appear like it does when the widget is activated
# comment this out for older versions of Tkinter
w.configure(inactiveselectbackground=w.cget("selectbackground"))
mainloop()
You could use an entry widget in a similar manner.
Upvotes: 19