2016-10-10 119 views
1

所以我有Entries有一些值從CFG文件分配給他們。我想在Entry更新時直接修改CFG文件,沒有submit按鈕;如何在沒有Tkinter中的「提交」按鈕的情況下更新Entry?

使用<Key>綁定會起作用,但只會取前一個值,而不是當前值,因爲按下的最後一個鍵不會作爲值考慮,而是作爲key-press

例如:

class EntryBox: 
    def __init__(self, value, option, section, grid_row, master_e): 
     self.section = section 
     self.option = option 
     self.box = Entry(master_e) 
     self.box.grid(column=0, row=grid_row) 
     self.serial_no = grid_row 
     self.box.insert(0, value) 
     self.box.bind("<Key>", lambda event: update_cfg(event, self, self.get_value())) 

    def get_value(self): 
     return self.box.get() 


    def update_cfg(evt, entry_box,new_value): 
     global config_file 
     config_file.set(entry_box.section, entry_box.option, new_value) 
     print "Config file modified. "+entry_box.section+" "+entry_box.option+" "+new_value 

如果entry05R當我點擊entry,按6,將打印;按7後,它會打印Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 0R56等等,總是在一個按鍵後面。在值更改後實時更新的唯一方法是按TABarrow按鈕。

回答

3

您可以使用

  • FocusOut
  • tabenter重點
  • KeyRelease

綁定實現這一目標。

驗證函數也可以提供幫助,因爲它們有以前的值和新的值。請閱讀docs瞭解有關此事的更多信息。

這是恕我直言的最「pythonic」/「tkinter」方式實現什麼是「檢查和提交」功能。

編輯

正如OP指出,結合focusout可能導致的問題在這裏的例子是如何確實工作:

import Tkinter as tk 
import sys 

def focus_out_event(event): 
    print >> sys.stderr, "Focus-Out event called with args: %s"%event 
    print >> sys.stderr, "Entry Widget Content:    %s"%event.widget.get() 
def key_release_event(event): 
    print >> sys.stderr, "Key-Release event called with args: %s"%event 
    print >> sys.stderr, "Entry Widget Content:    %s"%event.widget.get() 

if __name__ == "__main__": 
    root = tk.Tk() 
    entry1 = tk.Entry(root) 
    entry1.bind("", key_release_event) 
    entry1.bind("", focus_out_event) 
    entry1.grid() 

    entry2 = tk.Entry(root) 
    entry2.bind("", key_release_event) 
    entry2.bind("", focus_out_event) 
    entry2.grid() 

    root.mainloop() 

測試: - 輸入文字( 「ASD」)至entry1 - click into entry2

輸出的最後一行是從更改爲截圖(發生的事件是focusout

Test Result

+0

鍵釋放是最適合我的項目作爲重點出當你點擊其他窗口不保存。 –

+0

將檢查並更新我的答案。 – R4PH43L

1

您在event.char中有此key-press,因此您可以將其添加到文本中。

0

我決定<Key>在我的情況下不是正確的選擇,而是使用<FocusOut>。這樣,如果您使用鼠標或鍵盤TAB來更改該值,則在關注時會更新它。

相關問題