【发布时间】:2020-12-28 05:09:44
【问题描述】:
我正在使用 python 和 tkinter 构建一个项目符号列表文本小部件。我希望项目符号本身是“不可编辑的”,这意味着用户不能删除实际的项目符号字符。我创建了一个简单的示例来说明问题。在我的示例中,我添加了一个项目符号(“-”),然后添加了两个空格。用户可以退格并删除项目符号和我添加的两个空格,但我不希望他们能够这样做。我希望他们只能退格到“子弹示例”中的“B”。
我认为通过使用两个标签,一个用于项目符号,一个用于项目符号行上的文本,我可以做到这一点。它有点工作。项目符号标签添加了一个用户无法删除过去的左边距,但不幸的是,项目符号字符和我用于填充的空格仍然可以删除。
如何在用户可编辑的文本小部件中创建不可删除的项目符号(左右有边距)?
谢谢!
import tkinter as tk
from tkinter import font as font
class BulletText(tk.Text):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.bullet_char = '-'
self.num_spaces_per_indent = 4
self.num_spaces_after_bullet = 2
font_name = font.nametofont(self.cget("font"))
self.indent_width = font_name.measure(self.num_spaces_per_indent * ' ')
self.bullet_width = font_name.measure(f'{self.bullet_char}{self.num_spaces_after_bullet * " "}')
self.tag_configure('bullet', lmargin1=self.indent_width, background='red')
self.tag_configure('bullet_text', lmargin1=self.indent_width, lmargin2=self.indent_width + self.bullet_width,
background='green')
def insert_bullet(self, position, text):
# convert line and character to int
line = int(position.split('.')[0])
col = int(position.split('.')[1])
self.insert(f'{line}.0', self.bullet_char)
self.tag_add('bullet',f'{line}.0',f'{line}.1')
self.insert(f'{line}.1', f'{self.num_spaces_after_bullet*" "}')
self.tag_add('bullet_text', f'{line}.1', f'{line}.end+1c')
self.insert(f'{line}.3', text)
if __name__ == "__main__":
root = tk.Tk()
text = BulletText(root, width=40, height=15)
text.pack(fill="both", expand=True)
position = text.index('insert')
text.insert_bullet(position, "Bullet example")
root.mainloop()
【问题讨论】:
-
我认为昨天是类似的问题 - 或者可能是关于阻止
Ctr+C/Ctrl+V的问题是链接到使用tags控制文本的旧问题。