如何通过阻止输入的最新字符来限制python中tkinter文本小部件的长度?
我试图限制tkinter文本小部件或条目小部件中的字符数量。在Python中,这两种小部件类型都可以以非常具体的方式使用。我有一个文本小部件的解决方案,它很接近:如何通过阻止输入的最新字符来限制python中tkinter文本小部件的长度?,python,text,tkinter,widget,Python,Text,Tkinter,Widget,我试图限制tkinter文本小部件或条目小部件中的字符数量。在Python中,这两种小部件类型都可以以非常具体的方式使用。我有一个文本小部件的解决方案,它很接近: string = self.text.get("1.0","end-1c") if len(string) >= 5: self.text.delete('1.0', "end-1c") string = string[:-1] self.quantity_entry.insert(END, strin
string = self.text.get("1.0","end-1c")
if len(string) >= 5:
self.text.delete('1.0', "end-1c")
string = string[:-1]
self.quantity_entry.insert(END, string)
但是上面的代码执行以下操作:如果输入123456,它会将内容转换为12346。它删除现有字段5的最后一个字符,然后将键入的最后一个字符6放在末尾。所以变成了12346
我想要的是12345保持为12345,这意味着现有的12345字符串应该保持原样,并且任何新字符都会被有效地阻止追加。有办法做到这一点吗
我尝试使用:
self.text.configure(state="disabled")
这会阻止插入后续字符,因此12345保持为12345。但这会将该字段从未来的编辑中锁定。即使随后尝试使用:
self.text.configure(state="normal")
场地保持锁定。我希望用户能够编辑字段,如果他们达到五个字符的限制
谢谢。我想出了解决办法。在.bind方法中,我需要使用
"<KeyRelease>"
而不是
"<Key>"
然后,作为次要编辑,>=5需要更改为>5。现在它起作用了。当我输入123456时,它会在屏幕上很短地显示123456,但随后会快速地删除6,因此它会返回到12345。耶 追踪一个变量要整洁得多。然后它甚至不会在屏幕上短暂闪烁。您可以打包成一个整洁的子类,如下所示:
import tkinter as tk
class Lotfi(tk.Entry):
def __init__(self, master=None, max_len=5, **kwargs):
self.var = tk.StringVar()
self.max_len = max_len
tk.Entry.__init__(self, master, textvariable=self.var, **kwargs)
self.old_value = ''
self.var.trace('w', self.check)
def check(self, *args):
if len(self.get()) <= self.max_len:
self.old_value = self.get() # accept change
else:
self.var.set(self.old_value) # reject change
#demo code:
window = tk.Tk()
ent=Lotfi(window, max_len=5)
ent.pack()
window.mainloop()
我认为这里真正需要的是tkinter验证:您可以编写一个函数,每当用户试图编辑文本时都将调用该函数,其中将向您传递建议的新字符串或现有字符串,或两者,或各种不同的选项,您可以接受或拒绝更改。那能满足你的要求吗?如果是这样的话,我可以为你找到一个很好的重复问题和一个很好的答案。我进行了验证,但我仍然得到了最后输入的字符,这不是我想要的。我找到了解决方案,我在下面发布了。条目小部件的解决方案可能与文本小部件的解决方案大不相同。你喜欢哪一个?条目小部件有一个专门用于验证数据的选项。谢谢Bryan。我很高兴两人都能工作。但是现在我看到代码问题是key vs keyrease,我将尝试使用entry小部件。它具有验证功能,并且与文本小部件相比,删除语法更简洁。谢谢,新颖。我对trace很感兴趣,但我听说它被弃用了。但我没有找到任何确凿的证据。你有没有看到任何关于trace的权威正在被淘汰?trace没有贬值,我也没有听到任何人说有贬值的计划。谢谢,小说。我做了我自己版本的check方法,签名中没有*args,但它不起作用。然后我加入了*args,它成功了。为什么需要*args?调用该方法时,我没有向该方法提供任何参数。它一定是tkinter内部的东西。是的,tkinter的跟踪在调用函数时会发送3个无用的参数。如果您有兴趣,只需添加printarg即可查看它们。