Как можно выделить текст в виджете сообщения 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