Как вставить только некоторые указанные символы в виджет входа tkinter - PullRequest
0 голосов
/ 13 августа 2010

У меня есть список из n виджетов Entry. Пользователь должен иметь возможность вводить только следующие символы: «V», «F», «». Если пользователь вводит один из этих символов, фокус должен перейти от Entry #x к Entry # x + 1, в противном случае фокус должен остаться там, где он есть (на Entry #x), и ввод должен быть отброшен.

Я не могу отказаться от неправильного ввода: если пользователь нажимает клавишу, отличную от разрешенной, поле ввода получает этот ключ, но команда .delete (0, END) не работает, как сам виджет еще не запомнил нажатую клавишу.

Как я мог это сделать?

Ответы [ 2 ]

6 голосов
/ 13 августа 2010
import Tkinter as tk

def keyPress(event):
    if event.char in ('V', 'F', ' '):
        print event.char
    elif event.keysym not in ('Alt_r', 'Alt_L', 'F4'):
        print event.keysym
        return 'break'


root = tk.Tk()
entry = tk.Entry()
entry.bind('<KeyPress>', keyPress)
entry.pack()
entry.focus()

root.mainloop()

Вы можете легко разбить инструкцию, чтобы она переходила в другую форму в зависимости от ключа.

Часть event.keysym находится там, так что вы можете ALT-F4 закрыть приложениекогда вы в этом виджете.Если вы просто наберете else: return 'break', то он также будет захватывать все другие нажатия клавиш.

Это также чувствительный к регистру захват.Если вы хотите, чтобы регистр не учитывался, просто измените его на event.char.upper()

3 голосов
/ 22 января 2012

Используя опции validate и validatecommand, создается tk.Entry, который принимает символы только в 'VF ', но может сказать вам, какая клавиша нажата и какое значение записи в данный момент:

import Tkinter as tk

def validate(char, entry_value):
    if char in 'VF ':
        print('entry value: {P}'.format(P = entry_value))
        return True
    else:
        print('invalid: {s}'.format(s = char))
        return False

root = tk.Tk()
vcmd = (root.register(validate), '%S', '%P')
entry = tk.Entry(root, validate = 'key', validatecommand = vcmd)
entry.pack()
entry.focus()

root.mainloop()

У меня нет ссылки на документацию; Я узнал это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...