在python中的Entry小部件中达到字符串的MAX长度后,BACKSPACE选项卡不起作用

时间:2016-08-05 09:58:05

标签: python-2.7 tkinter

我创建了一个Tkinter Entry Box小部件,它只占用长度为6.的整数。我给出了一个输入值'1465146'。它达到了它的最大限制但是当我想使用“退格键”删除/编辑插入的文本时,它无法正常工作。我无法删除或编辑文本。

import Tkinter as tk

class Example(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        vcmd = (self.register(self.onValidate),
            '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(self, validate="key", validatecommand=vcmd)
        self.text = tk.Text(self, height=10, width=40)
        self.entry.pack(side="top", fill="x")
        self.text.pack(side="bottom", fill="both", expand=True)

    def onValidate(self, d, i, P, s, S, v, V, W):
        valid=self.Check_num(s,S)   
        return valid

    def Check_num(self,s,S):
        if S in '\b1234567890' and len(s)<=6:   
            return True
        else:return False


if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both")
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

输入&#34; 1234567&#34;等值时然后按退格键,进行两项检查:是否在其中一个允许的字符中插入或删除了字符,并且编辑之前的文本长度小于7。在这种情况下,在您按下退格键之前,长度恰好是7,因此不允许编辑。

如果您想确保小部件只允许您输入6位数字,您应该比较%P参数的长度,如果允许编辑,这是最终字符串。

此外,在允许的字符列表中包含\b并不会按照您的想法执行操作。它允许您在字符串中插入文字\b(control-h,ascii字符8)。如果您只想要数字,则应仅检查数字。当您按退格键时,s\b

最后,检查s是否在1234567890中是不会完全按照您的想法去做。您假设s是单个字符,但如果用户将某些内容粘贴到输入字段中,则可以是多个字符。例如,它会阻止您复制和粘贴字符串&#34; 21&#34;因为双字节序列&#34; 21&#34;所以进入输入字段不在字符串&#34; 1234567890&#34;。