Команда tk.Entry validate не восстанавливает предыдущее значение при возврате False - PullRequest
0 голосов
/ 19 марта 2020

Я внимательно рассмотрел ответы на Интерактивная проверка содержимого виджета Entry в tkinter , но мой сценарий не может восстановить предыдущее значение, если команда validate возвращает 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

1 Ответ

0 голосов
/ 19 марта 2020

Проверка не предназначена для восстановления чего-либо, если проверка происходит на focusout. Проверка может предотвратить добавление символов только во время их добавления. Вам нужно будет добавить код для восстановления предыдущего значения.

...