首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tkinter中从文本小部件复制格式化文本

在tkinter中从文本小部件复制格式化文本
EN

Stack Overflow用户
提问于 2013-03-31 00:10:59
回答 1查看 1.4K关注 0票数 4

我正在使用tkinter在Python中开发一个APA引文生成器。生成文本后,我使用文本小部件显示引文,但每当我复制文本(目前使用ctrl+c快捷方式)时,它就失去了格式。是否有办法从文本小部件中复制格式化文本(例如斜体文本),而不是复制未格式化文本?

EN

回答 1

Stack Overflow用户

发布于 2020-12-16 15:49:22

要将格式化文本复制到剪贴板,您需要python与系统剪贴板之间的接口,它支持文本格式设置。我已经找到了克兰博德,它应该适用于Linux和Windows (Mac用户可能可以将下面的解决方案修改为富旱菌)。

其想法是(1)将格式化文本从文本小部件转换为html,然后将其添加到剪贴板:

  1. 使用text.dump(index1, index2, tag=True, text=True),可以从小部件中检索文本和标记。它返回一个类似的列表(这是下面示例中小部件的内容): (“文本”、“作者等人”)(2012)。文章的标题。','1.0'),('tagon',‘斜体','1.48'),(’文本',‘期刊名称’,'1.48'),(‘标签’,‘斜体’,'1.60'),(‘文本’,‘’,'1.60'),(‘标签’,‘’,'1.62'),(‘文本’,'2','1.62'),(“标签”、“粗体”、“1.63”)、(“文本”、“(599)”、“1-5”、“1.63”)、(“文本”、“n”、“1.74”) 因此,很容易使用字典将每个('tagon/off', tagname)对与相应的html标记关联,并将小部件内容转换为html。
  2. klembord.set_with_rich_text(txt, rich_txt)将字符串txt和其html格式的等效格式放在剪贴板中。

下面是一个完整的示例(在Linux中测试,我能够从文本小部件中复制文本并将其粘贴到带有格式的字处理器中):

代码语言:javascript
复制
import tkinter as tk
import klembord

root = tk.Tk()
text = tk.Text(root)
text.pack(fill='both', expand=True)

text.tag_configure('italic', font='TkDefaultFont 9 italic')
text.tag_configure('bold', font='TkDefaultFont 9 bold')

TAG_TO_HTML = {
    ('tagon', 'italic'): '<i>',
    ('tagon', 'bold'): '<b>',
    ('tagoff', 'italic'): '</i>',
    ('tagoff', 'bold'): '</b>',
}

def copy_rich_text(event):
    try:
        txt = text.get('sel.first', 'sel.last')
    except tk.TclError:
        # no selection
        return "break"
    content = text.dump('sel.first', 'sel.last', tag=True, text=True)
    html_text = []
    for key, value, index in content:
        if key == "text":
            html_text.append(value)
        else:
            html_text.append(TAG_TO_HTML.get((key, value), ''))
    klembord.set_with_rich_text(txt, ''.join(html_text))
    return "break"  # prevent class binding to be triggered

text.bind('<Control-c>', copy_rich_text)

text.insert("1.0", "Author et al. (2012). The title of the article. ")
text.insert("end", "Journal Name", "italic")
text.insert("end", ", ")
text.insert("end", "2", "bold")
text.insert("end", "(599), 1–5.")

root.mainloop()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15724936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档