Tkinter Entry Multiple Vaildations - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь выполнить проверки как для ключа , так и focusout, так что ввод ограничен допустимыми символами, и я могу вызвать функцию, когда пользователь фокусируется (оставляя действительную запись) .

Возможно ли что-то подобное?

import tkinter as tk


class Example(tk.Frame):

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

    vcmd = (self.register(self.on_validate), '%S')
    vcmd2 = (self.register(self.if_valid), '%s')

    # This is the meat of the question; looking to do something like
    self.entry = tk.Entry(self, 
                          validate="key", 
                          validate2="focusout",
                          validatecommand=vcmd, 
                          validate2command=vcmd2)

    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 on_validate(self, S):

        # Disallow anything but binary string
        if S == '1' or '0':
            return True
        else:
            self.bell()
            return False

      def if_valid(self, s):
          if len(s) == 3:
             self.my_function(s)
             return True
          else:
             return False

     def my_function(self, value):
        # send value somewhere
        pass

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

1 Ответ

2 голосов
/ 08 мая 2020

Взято из: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/entry-validation.html Возможно, вы хотите использовать all ?

'focus' Проверять каждый раз, когда виджет Entry получает или теряет фокус ( см. Раздел 53, «Фокус: маршрутизация ввода с клавиатуры»).

'focusin' Проверять каждый раз, когда виджет получает фокус.

'focusout' Проверять всякий раз, когда виджет теряет фокус.

'key' Проверять всякий раз, когда любое нажатие клавиши изменяет содержимое виджета.

'all' Проверять во всех вышеупомянутых ситуациях.

'none' Отключить проверку. Это значение параметра по умолчанию. Обратите внимание, что это строка 'none', а не специальное Python значение None.

Если было важно, чтобы вы проверяли только focusout и key, вы могли бы использовать all а затем в вашем методе проверки вы можете просто вызвать метод .get_focus(), чтобы увидеть, был ли фокус на коробке или нет.

...