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