Как можно выделить текст в виджете сообщения tkinter? - PullRequest
0 голосов
/ 09 октября 2018

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

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

1 Ответ

0 голосов
/ 09 октября 2018

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

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