【问题标题】:How can I update Entry without a "submit" button in Tkinter?如何在 Tkinter 中没有“提交”按钮的情况下更新条目?
【发布时间】:2017-02-18 20:11:13
【问题描述】:

所以我有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 等等,总是在后面按一个键。更改值后实时更新它的唯一方法是按下TABarrow 按钮。

【问题讨论】:

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


    【解决方案1】:

    你可以使用任何一个

    • 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”) - 点击进入2

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

    【讨论】:

    • Key-release 最适合我的项目,因为当您单击另一个小部件时,focus-out 不会保存。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为&lt;Key&gt; 在我的情况下不是正确的选择,而是使用&lt;FocusOut&gt;。这样,如果您使用鼠标或键盘 TAB 更改值,则在聚焦时它会更新它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2016-08-29
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 2019-09-26
        相关资源
        最近更新 更多