我正在使用tkinter在Python中开发一个APA引文生成器。生成文本后,我使用文本小部件显示引文,但每当我复制文本(目前使用ctrl+c快捷方式)时,它就失去了格式。是否有办法从文本小部件中复制格式化文本(例如斜体文本),而不是复制未格式化文本?
发布于 2020-12-16 15:49:22
要将格式化文本复制到剪贴板,您需要python与系统剪贴板之间的接口,它支持文本格式设置。我已经找到了克兰博德,它应该适用于Linux和Windows (Mac用户可能可以将下面的解决方案修改为富旱菌)。
其想法是(1)将格式化文本从文本小部件转换为html,然后将其添加到剪贴板:
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。klembord.set_with_rich_text(txt, rich_txt)将字符串txt和其html格式的等效格式放在剪贴板中。下面是一个完整的示例(在Linux中测试,我能够从文本小部件中复制文本并将其粘贴到带有格式的字处理器中):
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()https://stackoverflow.com/questions/15724936
复制相似问题