我有一個n個輸入小部件的列表。用戶應該只能輸入以下字符:「V」,「F」,「」。如果用戶鍵入其中一個字符,焦點應該從條目#x傳遞到條目#x + 1,否則焦點應該停留在它的位置(在條目#x上),並且輸入應該被丟棄。如何在tkinter中插入一些指定的字符輸入小部件
我無法放棄錯誤的輸入:如果用戶按下與允許的不同的鍵,則Entry字段將獲得該鍵,但命令.delete(0,END)不起作用,因爲該小部件本身還沒有記住按鍵。
我該怎麼辦?
我有一個n個輸入小部件的列表。用戶應該只能輸入以下字符:「V」,「F」,「」。如果用戶鍵入其中一個字符,焦點應該從條目#x傳遞到條目#x + 1,否則焦點應該停留在它的位置(在條目#x上),並且輸入應該被丟棄。如何在tkinter中插入一些指定的字符輸入小部件
我無法放棄錯誤的輸入:如果用戶按下與允許的不同的鍵,則Entry字段將獲得該鍵,但命令.delete(0,END)不起作用,因爲該小部件本身還沒有記住按鍵。
我該怎麼辦?
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()
使用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。
謝謝你,我錯過了「返回'休息'」部分。如果我在它之前插入另一個linea(即使是簡單的打印語句),它也不起作用。 – zar 2010-08-13 18:43:33
@zar,不客氣 - 'return'break''是你如何阻止Tkinter事件傳播(即按下按鈕等)。 – 2010-08-13 18:45:35
其實,我說的不是真的。如果在「break」之前,我插入了另一行,它通過Entry小部件調用.get()語句。那個電話搞亂了一切。再次感謝。 – zar 2010-08-13 19:02:53