python - 如何能够选择 tkinter 消息小部件中的文本?
问题描述
我的 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
推荐阅读
- react-native - Fusion Chart (bar2d) 无法在 React Native 中滚动
- java - 如何在不从本地 xml、csv 文件访问 API 的情况下将变量发布到 php 站点?
- javascript - 将鼠标悬停在上下文菜单上时如何更改上下文菜单的 li 项的颜色
- javascript - 与索引 0 的 Levenshtein 距离
- php - 将“Image”标签替换为“a”标签 PHP DOMDocument
- azure-storage - 如何检查Azure容器中是否存在多个文件
- nginx - Nginx 服务于一个子域的根而不是另一个子域的根
- console - 如果qpad关闭但端口打开,qpad查询可以恢复吗?
- css - 媒体查询纵横比
- .htaccess - 覆盖特定页面的 301 重定向