我有一个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和其他资源上做了大量的研究,但没有找到解决方案。任何帮助都将不胜感激。你知道吗
除了Bryan Oakley的解决方案之外,它还允许在文本小部件中使用箭头键和退格进行导航:
可以说,最简单的解决方案是让函数插入字符,而不是让文本小部件来完成。你知道吗
示例:
相关问题 更多 >
编程相关推荐