2010-08-13 1 views
0

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

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

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

ответ

5
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()

+0

Спасибо, мне не хватало части «return» break. Если я вставляю еще одну строку перед ней (даже простую инструкцию печати), она не работает. – zar

+0

@zar, приветствую - 'return 'break'' - это то, как вы останавливаете события Tkinter от распространения (т. Е. Нажатия кнопок и т. Д.). –

+0

На самом деле, то, что я сказал, не соответствует действительности. Если перед «break» я вставил другую строку, которая вызывает оператор .get() поверх виджета Entry. Этот звонок все испортил. Еще раз спасибо. – zar

3

Использование 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() 

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

 Смежные вопросы

  • Нет связанных вопросов^_^