我创建了一个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()
答案 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;。