带验证和字符替换的多行文本小部件

2024-05-16 02:05:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Tkinter用例,我需要一个多行的文本框,可以过滤和替换字符。你知道吗

下面是一个简化但适用的用例:

  • 多行文本控件

  • 筛选,因此只能键入字符“A”、“B”、“C”、“0”、“1”和“*”

  • 上述过滤器的一个例外是,可以键入小写字符,但它们将转换为大写

因为我需要一个多行控件,Entry小部件不在了(它只是单行)。这意味着我需要使用文本小部件。你知道吗

有了文本小部件,我可以使用bind方法过滤文本。示例:

self.my_text_field.bind('<KeyPress>',self.filter_text)

def filter_text(self, event):
    character_set = ["A", "B", "C", "0", "1", "*"]
    if event.char.upper() in character_set:
        #Do nothing. Accept character.
        pass
    else:
        #Ignore character.
        return 'break'

上面的代码可以很好地进行过滤,但是它没有实现用.upper()版本替换任何较低字符的字符替换。你知道吗

因此,如果我真的想替换字符,我可以使用validatecommand实现与上面的.bind方法相同的过滤,如果我真的想替换字符,我需要使用invalidcommand在validate函数返回false时替换文本。请参阅包含validatecommand和invalidcommand的以下线程:

Interactively validating Entry widget content in tkinter

问题是validatecommand和invalid只在Entry小部件上可用(它也是单行的,在我的用例中不起作用)。你知道吗

我尝试在keyrease上使用.bind并使用.get和.insert来替换文本小部件的文本,但这很混乱,而且似乎不切实际,因为使用.delete和.insert更改控件的文本会导致编程版本和KeyPress/keyrease的其他实例。你知道吗

我总是可以忽略我的过滤器小写字符,仍然使用文本控件与我发现的日期,但我真的很想转换为大写字符以及。你知道吗

我在StackOverflow和其他资源上做了大量的研究,但没有找到解决方案。任何帮助都将不胜感激。你知道吗


Tags: text文本self过滤器键入bind部件用例
2条回答

除了Bryan Oakley的解决方案之外,它还允许在文本小部件中使用箭头键和退格进行导航:

def filter_text(self, event):        

    character_set = ["A", "B", "C", "0", "1", "*"]   

    navigation_keys = ['Left','Right','Up','Down','BackSpace']        

    if event.char.upper() in character_set:
        event.widget.insert('insert', event.char.upper())
    elif event.keysym in navigation_keys:
        return True

    return 'break'  

可以说,最简单的解决方案是让函数插入字符,而不是让文本小部件来完成。你知道吗

示例:

def filter_text(self, event):
    character_set = ["A", "B", "C", "0", "1", "*"]
    if event.char.upper() in character_set:
        event.widget.insert("insert", event.char.upper())
    return "break"

相关问题 更多 >