【问题标题】:How to generate tab key even when enter key pressed in TKinter (python)?即使在 TKinter(python)中按下输入键,如何生成制表键?
【发布时间】:2020-04-13 22:56:17
【问题描述】:

我正在尝试找出如何在 tkinter/python 中生成 TAB 键事件。

我在 tkinter 中有一个用于返回键的键绑定。

am_field_txt.bind('<Return>', next_focus)

我不想调用函数 (next_focus),而只是想生成一个 TAB 事件,这样对正在使用的条目的现有验证将能够使用按下 Tab 键时发生的“focusout”来运行。 (我已经设置了带有验证的文本条目,以便在 validate=focusout 上进行检查并处理所有事情;但我希望它能够处理用户可以按返回而不是“focusout”条件的一种情况(选项卡或单击文本框外))。 我真的不想使用 validate=key ,因为只要按下一个键,该例程就会运行(而且它已经设置好并用于焦点输出)。

是否有一种简单的方法来绑定条目的返回键,以便发生 TAB 事件?

我在网上找到了 TCL 的文档,上面写着:

bind .w <Return> {focus [tk_focusNext %W]}
bind .w <Return> {event generate %W <Tab>}

最后一行是我想做的——除了 Python 和 tkinter 的格式/语法。 我已经使用了 tk_focusNext 函数,但它再次使用了 tkinter/python 的不同语法,所以我认为从第二行开始,它一定意味着如果按下 RETURN 键,就有一种方法可以生成一个 TAB 键。 (除此之外,tk_focusNext 也不能​​正常工作,似乎选择了与 tab 键不同的焦点......但这是一个不同的主题)。

【问题讨论】:

    标签: python validation events tkinter bind


    【解决方案1】:

    可以说,最简单的方法是精确绑定底层 tk 小部件的功能,方法是向 tk 询问绑定到 tab 键的函数并将其分配给 enter 键,如下所示:

    am_field_txt.bind('<Return>', root.bind_all("<Tab>"))
    

    这将使回车键的行为与制表键完全相同,包括设置焦点和选择小部件中的文本。

    如果您不希望选择下一个小部件中的文本,您可以创建 next_focus 函数,使其看起来像这样:

    def next_focus(event):
        event.widget.tk_focusNext().focus_set()
    

    【讨论】:

    • 嗨,我试过你的第一行 am_field_txt.bind('', root.bind_all(""));但这不起作用。它不像 tab 键被按下。我猜是因为 tab 并没有真正绑定到任何东西。 validate 'focusout' 是使用 tab 事件的原因,所以我想这对我的代码不起作用是有道理的。
    【解决方案2】:

    您可以在 Python 绑定中使用 TCL 代码作为参数

    import tkinter as tk
    
    root = tk.Tk()
    
    e1 = tk.Entry(root)
    e1.pack()
    e2 = tk.Entry(root)
    e2.pack()
    
    #bind .w <Return> {event generate %W <Tab>}
    e1.bind('<Return>', 'event generate %W <Tab>')
    e2.bind('<Return>', 'event generate %W <Tab>')
    
    root.mainloop()
    

    还有event_generate()

    e2.bind('<Return>', lambda x:root.event_generate('<Tab>'))
    

    【讨论】:

    • 我试过你的 event_generate() 并且有效。谢谢! “x:”有什么作用?
    • bind 期望获得一个参数的函数,因此它可以发送有关event 的信息。我使用x 来获取这个值——比如def func(x): root.event_generate('&lt;Tab&gt;')——但后来我不使用它了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多