如何在tkinter应用程序中设置标签顺序?

2024-04-26 08:09:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有没有什么方法可以定制订单,更重要的是,将CTRL+选项卡更改为just选项卡?


Tags: 方法订单应用程序顺序tkintertab选项卡控件
1条回答
网友
1楼 · 发布于 2024-04-26 08:09:33

Tab顺序基于堆叠顺序,而堆叠顺序又默认为创建小部件的顺序。您可以使用tkraise(或lift)和lower方法来调整堆叠顺序(以及制表符顺序)。

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

下面是一个示例,演示如何反转制表符顺序。运行示例时,在第一个条目中按tab键应该会转到最后一个条目。再次按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键从文本小部件改变焦点。通常,制表键插入文本制表符。如果您想改变焦点,只需向<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"

相关问题 更多 >