2015-06-01 33 views
-1

今天下午我很無聊,決定在Python中實現一個速度打字測試;爲了在每個字符後檢查當前單詞,我在入口窗口小部件上使用了widgetName.bind("<Key>", functionName),以便每當在入口窗口小部件中按下任何按鍵時調用該函數。如何在使用.bind調用函數時強制刷新Tkinter小部件

這工作正常,每次按鍵時都會調用該函數,但是當我使用widgetName.get()從條目窗口小部件收集字符串時發生了問題; .get()沒有收集小部件的內容,只有那些在調用函數之前的小部件的內容。例如,如果我在輸入窗口小部件中鍵入'P',我的功能將打印'按下一個鍵',但是它只會向控制檯打印一個空行。當我繼續按'y'時,字符串'P'被輸出到控制檯,當第三個按鍵'Py'被輸出時等等。

這讓我相信Tkinter小部件的內容還沒有更新,因爲.bind()調用是在小部件內容更新之前發生的,因此小部件的內容只有一個按鍵。

我需要知道是否有解決方法,我做了一些研究,發現我可以從函數內調用root.update()widget.update(),這應該強制刷新UI。然而,這並沒有幫助,我仍然面臨同樣的問題。

我的代碼如下

root = Tk() 
def keyPress(forSomeReasonThisArgumentFixesABug): ##Argument is because bind passes the event to the function 
    entryBox.update() 
    entry, word = entryBox.get(), wordBox.get() 
    print(entry) 

wordBox = Entry(root) 
wordBox.grid(row=0, column=0) 
entryBox = Entry(root) 
entryBox.grid(row=1, column=0) 
entryBox.bind("<Key>", keyPress) 

可能有人請解釋一下我怎麼能(通過獲得()通過一個參數或函數中)在每個按鍵通過widget的內容的功能。

在此先感謝 編輯:我也曾嘗試使用.bind()調用的函數調用另一個函數,它看起來噁心,仍然無法正常工作

回答

0

好吧,我似乎已經固定我的問題,但不是按照我原先的意圖。 爲了看到輸入的字符我使用.char上傳遞給函數的事件參數.bind()。這使我可以看到字符,但是我仍然無法看到完整的字符串,而沒有連接使用.get()收集的字符串和使用.char收集的字符串。 這個工作,但它看起來不是很好,似乎不屬於Python,所以我仍然開放,以更加乾淨和有效地工作的答案。

def keyPress(event): ##Argument is because bind passes the event to the function 
    collectedString = (entryBox.get() + event.char) 
    print(collectedString) 
+0

注:您的解決方案將不能很好地工作,如果觸發結合,關鍵是刪除鍵,或者如果用戶將光標移動到了字符串末尾的任何位置。 –

+0

是的,我已經意識到並解決了退格問題。光標的移動不應該成爲問題,因爲用戶需要很快地輸入單個單詞。 –

0

簡短的回答是,默認綁定(導致得到插入字符的)後您的自定義綁定發生。解決方案是確保綁定發生在默認綁定之後。

這個答案進入有更詳細的瞭解究竟發生了:

https://stackoverflow.com/a/11542200/7432

最簡單的辦法是綁定在<KeyRelease>而非<Key>,因爲默認綁定在印刷機上發生。因此,釋放密鑰的綁定將會看到插入的字符。

另一種解決方案是更改小部件的綁定標籤。這個答案給出了一個工作例子說明了這個問題,並顯示使用綁定標籤解決方案:

https://stackoverflow.com/a/3513906/7432

相關問題