Как запретить ввод символов в текстовый виджет Text() tkinter?
Хотелось бы узнать, как запретить в реальном времени ввод определенных символов? К примеру букв, чтобы при нажатии на соответствующие символам клавиши, ничего не выводилось в виджет, как это реализовать?
from tkinter import *
root = Tk()
root.title('Python')
root.geometry('158x55')
root.resizable(width = False, height = False)
First_line = Frame(root, background='olivedrab')
Expression = Text(First_line, background = "silver", foreground = "black",
width = 17, height=3)
Expression.pack(side = LEFT, padx = 2, pady = 2)
First_line.pack(anchor = W)
root.mainloop()
Ответы (1 шт):
Можно привязаться к событию нажатия клавиши, и если введена буква, то вернуть строку "break" из обработчика, тогда событие не будет отправлено следующим обработчикам, в том числе и стандартному, который отвечает за вывод букв в текстовое поле.
def check_keys(event):
if event.char.isalpha():
return "break"
Expression.bind("<Key>", check_keys)
Но это не защитит от вставки текста с буквами из буфера обмена.
Можно запретить возможность вставки через Ctrl-V, для этого нужно дополнить условие:
def check_keys(event: Event):
# Условие event.state & 4 проверяет, что зажат Ctrl
if event.char.isalpha() or (event.state & 4 and event.keysym == "v"):
return "break"
Для текстовых полей Entry (не Text) также можно применять валидацию:
Expression = Entry(First_line, background = "silver", foreground = "black")
Expression.pack(side = LEFT, padx = 2, pady = 2)
def check_keys(text, action):
# Не событие вставки или ни один символ в тексте не является буквой
return action != '1' or not any(char.isalpha() for char in text)
Expression.config(validate="key", validatecommand=(Expression.register(check_keys),'%P','%d'))
На основе примера с английского stackoverflow: https://stackoverflow.com/a/35554720/4752653 @user1683793
Такой вариант защищает от вставки текста с буквами из буфера обмена, но для Text такой вариант не работает, выкидывает ошибку _tkinter.TclError: unknown option "-validate"
