我的 GUI 设计不错。我希望能够选择消息小部件中显示的文本。我看到的唯一建议是在只读模式下使用 Entry 小部件,但这看起来与 Message 小部件完全不同,或者使用看起来完全不同的 Text 小部件。如何选择消息小部件中的文本?
如果这是不可能的,我如何让 Text 或 Entry 小部件的外观和行为与 Message 小部件相同?
我的 GUI 设计不错。我希望能够选择消息小部件中显示的文本。我看到的唯一建议是在只读模式下使用 Entry 小部件,但这看起来与 Message 小部件完全不同,或者使用看起来完全不同的 Text 小部件。如何选择消息小部件中的文本?
如果这是不可能的,我如何让 Text 或 Entry 小部件的外观和行为与 Message 小部件相同?
简短的回答是否定的,你不能。您可能可以通过事件捕获做一些聪明的解决方法,但这比您预期的要多得多。
正如您所提到的,最有可能实现这一点的方法就是模拟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