Я понимаю, что уже довольно поздно для ответа, но чувствую, что могу дать гораздо более простой ответ на этот вопрос ... это действительно довольно просто, когда вы понимаете, как это работает.
Используйте функцию проверки, которая поставляется с виджетом Entry
.
Предположим, self
это виджет:
vcmd = (self.register(self.callback))
w = Entry(self, validate='all', validatecommand=(vcmd, '%P'))
w.pack()
def callback(self, P):
if str.isdigit(P) or P == "":
return True
else:
return False
Вам не нужно включать все коды замены : ('%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'
), необходимы только те, которые вы будете использовать.
Виджет Entry
возвращает строку, поэтому вам придется каким-то образом извлекать любые цифры, чтобы отделить их от других символов. Самый простой способ сделать это - использовать str.isdigit()
. Это удобный небольшой инструмент, встроенный прямо в библиотеки Python и не требующий дополнительного импорта, и он будет идентифицировать любые цифры (цифры), которые он найдет из строки , которую возвращает виджет Entry
.
Часть or P == ""
оператора if позволяет вам удалить всю вашу запись, без нее вы не сможете удалить последнюю (первую в поле ввода) цифру из-за '%P'
, возвращающего пустое значение и вызывающего Ваш обратный вызов для возврата False
. Я не буду вдаваться в подробности, почему здесь.
validate='all'
позволяет обратному вызову оценивать значение P
при focusin
, focusout
или при любом key
изменении содержимого виджета и, следовательно, вы не оставляете никаких отверстий для отклонения. ошибочно введенные символы.
В общем, чтобы все было просто. Если ваш обратный вызов вернет True
, это позволит ввести данные. Если обратный вызов возвращает «False», он по существу «игнорирует» ввод с клавиатуры.
Проверьте эти две ссылки. Они объясняют, что означает каждый код замещения и как их реализовать.
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html
http://stupidpythonideas.blogspot.ca/2013/12/tkinter-validation.html
EDIT:
Это будет заботиться только о том, что разрешено в коробке. Однако внутри обратного вызова вы можете добавить любое значение, которое P
имеет к любой переменной, которую вы хотите.