首页 > 解决方案 > 如何通过阻止输入的最新字符来限制 python 中 tkinter 文本小部件的长度?

问题描述

我试图以一种非常具体的方式限制 Python 中 tkinter 文本小部件或条目小部件(任何一种小部件类型都可以)中的字符数量。我有一个带有接近文本小部件的解决方案:

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")

该字段保持锁定。如果用户达到五个字符的限制,我希望用户能够编辑该字段。

谢谢你。

标签: pythontexttkinterwidget

解决方案


跟踪变量会更整洁。然后它甚至不会在屏幕上短暂闪烁。你可以像这样打包成一个整洁的子类:

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()

推荐阅读