Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过阻止输入的最新字符来限制python中tkinter文本小部件的长度?_Python_Text_Tkinter_Widget - Fatal编程技术网

如何通过阻止输入的最新字符来限制python中tkinter文本小部件的长度?

如何通过阻止输入的最新字符来限制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

我试图限制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, 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即可查看它们。