如何在Tkinter中没有“提交”按钮的情况下更新Entry?

时间:2016-10-10 11:55:25

标签: python user-interface tkinter keypress tkinter-entry

所以我有Entries从CFG文件中为它们分配了一些值。我希望在Entry更新后实时修改CFG文件,不带submit按钮;

使用<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

如果我点击entry并按下6时05R中的值为entry,则会打印Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 05R;在我按下7之后,它将打印Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 0R56,依此类推,始终只有一个按键。更改值后,实时更新它的唯一方法是按TABarrow按钮。

3 个答案:

答案 0 :(得分: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()

测试: - 在entry1中输入文本(“asd”) - 点击进入entry2

输出的最后一行是从更改为屏幕截图(触发focusout的事件)

Test Result

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我认为<Key>在我的情况下不是正确的选项,而是使用<FocusOut>。这样,如果您使用鼠标或键盘TAB更改值,则在焦点上会更新它。