如何在 tkinter 应用程序中设置 Tab 键顺序?

问题描述 投票:0回答:3

我一直在寻找一种在 tkinter 应用程序中设置 Tab 键顺序的方法,我一直在研究这个方法。目前默认顺序似乎是从上到下工作的,但它需要使用 CTRL + Tab 循环浏览控件。

有没有办法自定义顺序,更重要的是,将 CTRL + Tab 更改为仅 Tab?

python python-3.x tabs tkinter
3个回答
21
投票

Tab 顺序基于堆叠顺序,而堆叠顺序又默认为创建小部件的顺序。您可以使用方法

tkraise
(或
lift
)和
lower
调整堆叠顺序(以及 Tab 键顺序)。

这应该是开箱即用的,无需按 CTRL + Tab。但请注意,该选项卡会在文本小部件中插入文字选项卡,而不是将焦点移至另一个控件。当然可以更改默认行为。

以下示例展示了如何反转 Tab 键顺序。运行该示例时,在第一个条目中按 Tab 键应该会转到最后一个条目。再次按下选项卡,您将进入第二个,然后是第一个,起泡沫,冲洗,重复

请注意,原生

Tk
命令是
raise
lower
,但由于
raise
是 Python 中的保留字,因此必须在 tkinter 中重命名。

import Tkinter as tk


class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        e1 = tk.Entry(self)
        e2 = tk.Entry(self)
        e3 = tk.Entry(self)

        e1.insert(0,"1")
        e2.insert(0,"2")
        e3.insert(0,"3")

        e1.pack()
        e2.pack()
        e3.pack()

        # reverse the stacking order to show how
        # it affects tab order
        new_order = (e3, e2, e1)
        for widget in new_order:
            widget.lift()


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

既然您提到必须执行 CTRL + Tab,我猜您正在尝试让 Tab 键从文本小部件更改焦点。通常,制表符键会插入文字制表符。如果您希望它更改焦点,只需向

<Tab>
事件添加绑定即可。

Tkinter 有一个函数将返回下一个应该获得焦点的小部件的名称。不幸的是,对于旧版本的 Tkinter,该功能有缺陷。然而,解决这个问题很容易。您可以将以下几个方法添加到上面的代码中:

    def _focusNext(self, widget):
        '''Return the next widget in tab order'''
        widget = self.tk.call('tk_focusNext', widget._w)
        if not widget: return None
        return self.nametowidget(widget.string)

    def OnTextTab(self, event):
        '''Move focus to next widget'''
        widget = event.widget
        next = self._focusNext(widget)
        next.focus()
        return "break"

0
投票

我一直在寻找在 Tab 键切换时跳过某些小部件的方法,并在 tkinter 的

tk_focusNext
函数描述中找到以下内容:“如果将 takefocus 资源设置为 0,则将忽略小部件。” 您可以将 takefocus 设置为小部件初始化作为参数。


0
投票

问题已经得到解答,但这里有一个观察结果:小部件的选项卡顺序遵循它们在代码中创建的顺序。这应该提供一种无需编码即可订购选项卡的简单方法。

© www.soinside.com 2019 - 2024. All rights reserved.