首页 > 解决方案 > 如何能够选择 tkinter 消息小部件中的文本?

问题描述

我的 GUI 设计不错。我希望能够选择消息小部件中显示的文本。我看到的唯一建议是在只读模式下使用 Entry 小部件,但这看起来与 Message 小部件完全不同,或者使用看起来完全不同的 Text 小部件。如何选择消息小部件中的文本?

如果这是不可能的,我如何让 Text 或 Entry 小部件的外观和行为与 Message 小部件相同?

标签: pythontkintertkinter-layouttkinter-menu

解决方案


简短的回答是否定的,你不能。您可能可以通过事件捕获做一些聪明的解决方法,但这比您预期的要多得多。

正如您所提到的,最有可能实现这一点的方法就是模拟Message一个EntryText小部件的外观。一种简单的方法是使用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

推荐阅读