2010-08-13 57 views
0

我有一個n個輸入小部件的列表。用戶應該只能輸入以下字符:「V」,「F」,「」。如果用戶鍵入其中一個字符,焦點應該從條目#x傳遞到條目#x + 1,否則焦點應該停留在它的位置(在條目#x上),並且輸入應該被丟棄。如何在tkinter中插入一些指定的字符輸入小部件

我無法放棄錯誤的輸入:如果用戶按下與允許的不同的鍵,則Entry字段將獲得該鍵,但命令.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

謝謝你,我錯過了「返回'休息'」部分。如果我在它之前插入另一個linea(即使是簡單的打印語句),它也不起作用。 – zar 2010-08-13 18:43:33

+0

@zar,不客氣 - 'return'break''是你如何阻止Tkinter事件傳播(即按下按鈕等)。 – 2010-08-13 18:45:35

+0

其實,我說的不是真的。如果在「break」之前,我插入了另一行,它通過Entry小部件調用.get()語句。那個電話搞亂了一切。再次感謝。 – zar 2010-08-13 19:02:53

3

使用validatevalidatecommand選項,這將創建一個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

相關問題