В tkinter python, как я могу сделать метку, чтобы вы могли выбирать текст с помощью мыши?

В интерфейсе tkinter python есть параметр конфигурации, который изменит метку, чтобы вы могли выбрать текст в метке, а затем скопировать его в буфер обмена?

РЕДАКТИРОВАТЬ:

Как бы вы изменили это приложение «Hello World», чтобы обеспечить такую ​​функциональность?

from Tkinter import *

master = Tk()

w = Label(master, text="Hello, world!")
w.pack()

mainloop()

person Ross Rogers    schedule 21.10.2009    source источник


Ответы (5)


Самый простой способ — использовать отключенный текстовый виджет высотой в 1 строку:

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()

Вы можете использовать виджет входа аналогичным образом.

person Bryan Oakley    schedule 21.10.2009
comment
Для меня state="disabled" даже не позволяет выделить текст для копирования. Установка его на state="readonly" действительно сработала. - person AneesAhmed777; 07.06.2017
comment
Он должен быть отключен для текста, только для чтения для ввода, если кто-то хочет скопировать. - person F.Webber; 30.05.2019

Внесены некоторые изменения в приведенный выше код:

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()

Рельеф должен быть плоским, чтобы он выглядел как обычная часть дисплея. :)

person Sunjay Varma    schedule 26.09.2010

Вы можете создавать тексты, которые можно выбирать с помощью Text или 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()
person Jaidee    schedule 30.11.2018

Пробовал ответ Брайана Окли. Выделил текст, но не смог скопировать в буфер обмена. Вот обходной путь.

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()

Мы не могли скопировать текст, пока виджет не сфокусировался. В любом случае мы будем использовать кнопку мыши1 (щелчок левой кнопкой мыши) для выбора текста, поэтому привяжем его к функции, которая включает текстовый виджет, устанавливает на нем фокус, а затем снова отключает его.

person Vignesh Arunachalam    schedule 09.04.2020

Другие ответы вставляют текст в текстовое поле вместо замены текста. Это работает, когда вам нужно изменить текст только один раз. Однако вам нужно сначала удалить строку, если вам нужно ее заменить. Следующий код решит эту проблему:

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()
person Abdulkarim Malkadi    schedule 17.06.2021