tk.Entry 验证命令在返回 False 时不恢复以前的值

tk.Entry validate command doesn't restore previous value when False returned

我已经仔细查看了 Interactively validating Entry widget content in tkinter 的答案,但是如果验证命令 returns False,我的脚本无法恢复以前的值。我捕获了 %P 和 %s 并将它们打印出来...它们都显示相同的值。

import tkinter as tk

class Controller :
    def __init__(self) :
        i=10
        j=20
        # list comprehension
        self.entry_widgets = [[None for col in range(j)] for row in range(i)]
        #print(self.entry_widgets)

        self.values = [["string"+str(row) + str(col) for col in range(10)] for row in range(20)]
        #print(self.values)
class EnterBox(tk.Entry):

    def __init__(self,*args,**kwargs):
        #print (args)
        self._modified = False
        self._save = 0
        self._raise = 1
        self._lower = 2


        frame, i,j, *newargs = args
        self._content = tk.StringVar()

   #        tk.Entry.__init__(self,frame,*newargs,
   #                          validate = 'focusout', 
   #                          validatecommand = vcmd,
   #                          **kwargs)
        tk.Entry.__init__(self,frame,*newargs,**kwargs)

        vcmd = (self.register(self._revert), '%P', '%s')
        ct.entry_widgets[i][j] = self
        self.config(textvariable=self._content)
        self.config(validate = "focusout")
        self.config(validatecommand = vcmd )
        x=(ct.values[i][j])
        self.insert(0,x)
       #self._content.set(x)
        self.bind("<Return>",lambda  event, x=self._save : self._action(event,x) )
        self.bind("<Button-2>",lambda event, x=self._save : self._action(event,x) )
        self.bind("<FocusIn>", lambda event, x=self._raise : self._action(event,x))
        self.bind("<FocusOut>", lambda event, x=self._lower : self._action(event,x))
        self.bind('<Button-3>', lambda event, x=self._lower : self._action(event,x))

        self.grid(column=i+1,row=j+2)

def _revert(self,P,s):
    print ("Hi There")
    print(P)
    print(s)
    return False
def _action(self,event,action):
    print(str(action)+' ' + str(event))
    if action == self._save :
        ct.values[i][j] = self._content.get()
        self.config(bg='lightskyblue2')
        self._modified = True
    elif action == self._raise :
        self.config(bg = 'light pink')
    elif action == self._lower :
        self.config(bg = 'gray80')
        self._modified = False
    else :
        print('action value is bad action =>' + str(action))
if "__main__" == __name__ :
    root = tk.Tk()
    frame = tk.Frame()
    i=j=0

    ct = Controller()
    root.grid()
    frame.grid()
    check = EnterBox(frame,i,j,width = 24)
    check2 = EnterBox(frame,i+1,j,width = 24)
    root.mainloop()

我已经尝试删除所有其他绑定,但无济于事。 有趣的是,但是一个单独的问题,如果我使用 StringVar。设置而不是 self.insert,(参见注释行)验证命令运行一次,尽管焦点发生了几次变化,但再也不会运行。使用 Python 3.8

如果验证发生在 focusout,验证的目的不是为了恢复任何内容。验证只能在添加字符时阻止添加字符。您将必须添加代码来恢复以前的值。