如何在tkinter应用中设置选项卡顺序?

12 投票
2 回答
15268 浏览
提问于 2025-04-16 21:28

我一直在寻找一种方法,来设置我正在开发的tkinter应用程序中的标签顺序。目前,默认的顺序似乎是从上到下,但需要按 CTRL + Tab 来循环浏览控件。

有没有办法自定义这个顺序,并且把 CTRL + Tab 改成只按 Tab 键呢?

2 个回答

0

我一直在寻找在使用Tab键时跳过某些小部件的方法,发现tkinter中的tk_focusNext函数说明里提到:“如果一个小部件的takefocus属性设置为0,它就会被忽略。”

你可以在初始化小部件时,把takefocus作为一个参数来设置。

21

标签的顺序是根据控件的堆叠顺序来决定的,而这个堆叠顺序又是根据控件创建的顺序来默认设置的。你可以通过使用 tkraise(或者 lift)和 lower 方法来调整这个堆叠顺序(也就是标签的顺序)。

通常情况下,这个功能应该可以直接使用,不需要按 CTRL + Tab。不过要注意,按下标签键在文本控件中会插入一个实际的制表符,而不是切换到另一个控件。当然,这种默认行为是可以改变的。

下面是一个示例,展示如何反转标签的顺序。在运行这个示例时,按下标签键在第一个输入框中应该会跳到最后一个。再按一次标签键会跳到第二个,然后是第一个,循环往复。

需要注意的是,原生的 Tk 命令是 raiselower,但由于 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> 事件添加一个绑定即可。

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"

撰写回答