Как можно выделить текст в виджете сообщения tkinter?

У меня есть хороший дизайн для моего графического интерфейса. Я хотел бы иметь возможность выбрать текст, отображаемый в виджетах сообщений. Единственные предложения, которые я видел, это либо использовать виджет Entry в режиме только для чтения, но это выглядит совершенно иначе, чем виджет Message, либо использовать виджет Text, который снова выглядит совершенно иначе. Как выбрать текст в виджете "Сообщение"?

Если это невозможно, как заставить виджет Text или Entry выглядеть и вести себя так же, как виджет Message?

1 ответ

Короткий ответ - нет, ты не можешь. Возможно, вам удастся сделать какой-то умный обходной путь с захватом событий, но это гораздо больше работы, чем вы могли бы ожидать.

Как вы упомянули, наиболее вероятный способ реализовать это - просто эмулировать Message смотреть на Entry или же Text виджет. Простой способ использования ttk.Style скопировать внешний вид виджетов под ttk вместо. Однако нет Message виджет под ttk, но Label режет довольно близко:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
lbl = ttk.Label(root, text='foo')
lbl.winfo_class()

# 'TLabel'
# This means ttk.Label uses a 'TLabel' style

# Set a StringVar to update the message without updating the state
my_txt = tk.StringVar()

my_msg = ttk.Entry(root, text=my_txt, style='TLabel', justify='center', state='readonly')

# justify to emulate the Message look (centered).
# state = `readonly` to protect the Entry from being overwritten

my_txt.set('message here')

Ваш Entry виджет теперь будет выглядеть как Message виджет с текстом 'message here' копировать без доступа для записи.

Изменить: Если вы хотите изменить размер записи на основе символов, предполагая, что у вас есть шрифт фиксированной длины, вы можете попробовать это:

my_msg.pack(expand=True, fill=tk.BOTH)
my_txt.set('this is a way longer message so give it a try whatever')
my_msg.configure(width=len(my_txt.get()))

Если ваш шрифт не фиксированной длины, вы можете определить среднюю / максимальную ширину для каждого увеличения символа и умножить соотношение на len():

my_msg.configure(width=int(len(my_txt.get())*0.85))
# where you anticipate each character might take only up to 85% of the normal character width
Другие вопросы по тегам