如何在 Tkinter 中没有 "submit" 按钮的情况下更新条目?
How can I update Entry without a "submit" button in Tkinter?
所以我 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
中的值是05R
,当我点击entry
并按6时,它会打印Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 05R
;在我按下 7 之后,它会打印 Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 0R56
等等,总是在一个按键后面。更改值后实时更新它的唯一方法是按 TAB
或 arrow
按钮。
您在 event.char
中有此 key-press
,因此您可以将其添加到文本中。
我认为 <Key>
对我来说不是正确的选择,而是使用 <FocusOut>
。这样,如果您使用鼠标或键盘更改值 TAB
,焦点移出时它会更新它。
您可以使用
FocusOut
tab
或 enter
键
KeyRelease
实现这一目标的绑定。
验证函数也可以提供帮助,因为它们具有可用的旧值和新值。请阅读 docs 以获取有关该问题的更多信息。
恕我直言,这是实现 "check and submit" 功能的最 "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
- 点击进入entry2
输出的最后一行是从更改为屏幕截图(触发 focusout
的事件)
所以我 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
中的值是05R
,当我点击entry
并按6时,它会打印Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 05R
;在我按下 7 之后,它会打印 Config file modified. CURRENT_MEASUREMENT_EXAMPLE_HP shunt_resistance 0R56
等等,总是在一个按键后面。更改值后实时更新它的唯一方法是按 TAB
或 arrow
按钮。
您在 event.char
中有此 key-press
,因此您可以将其添加到文本中。
我认为 <Key>
对我来说不是正确的选择,而是使用 <FocusOut>
。这样,如果您使用鼠标或键盘更改值 TAB
,焦点移出时它会更新它。
您可以使用
FocusOut
tab
或enter
键KeyRelease
实现这一目标的绑定。
验证函数也可以提供帮助,因为它们具有可用的旧值和新值。请阅读 docs 以获取有关该问题的更多信息。
恕我直言,这是实现 "check and submit" 功能的最 "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 - 点击进入entry2
输出的最后一行是从更改为屏幕截图(触发 focusout
的事件)