【问题标题】:Can i have non-deletable characters in an editable tkinter text widget? [duplicate]我可以在可编辑的 tkinter 文本小部件中包含不可删除的字符吗? [复制]
【发布时间】: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()

【问题讨论】:

标签: python tkinter


【解决方案1】:

据我所知,您的问题有两种可能的解决方案。

  1. 您可以有一个函数来检查 BulletText 在位置 [0][1][2] 的当前输入值是否为“- ”,如果不是则重新插入它们那里,或

  2. 您可以将label 对象放在您的BulletText 行前。这不仅会阻止用户删除空格和项目符号,还会阻止用户在一般情况下选择它们,因此不需要检查或额外的功能。我认为这可能是最好的选择。然后,您可以使用geometry 来对齐标签和文本容器。

希望我的回答对您有所帮助!

【讨论】:

  • 好的,我选择了选项 1,这是最简单的。希望我能回答我自己的问题,但代码如下: def on_backspace(self, event): # current position - 1 (this is before insert) position = self.index('insert') # convert line and character to int line = int(position.split('.')[0]) col = int(position.split('.')[1]) # 获取当前光标位置的所有标签 tags = self.tag_names(position) if any("bullet" in s for s in tags): if col in [0,1,2,3]: return 'break'
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多