Kivy 简明教程

Kivy - Tabbed Panel

许多 GUI 工具包都包含一个标签页面板,因为它非常方便地将界面控件分组显示,而不是一个大表单,超出显示设备的维度。Kivy 中的 TabbedPanel 控件可以将一个小部件或布局显示在不同面板中,而不会使 GUI 设计看起来笨拙。不同面板中的控件可以在它们之间共享数据。

不同的选项卡作为顶部的菜单显示,其中实际选项卡按钮有一个标题区域,当前选项卡内容有一个内容区域。

kivy tabbed panel

TabbedPanel 对象是多个面板的顶级容器。对于每个面板,都添加了一个 TabbedPanelItem 对象。每个 TabbedPAnelItem 反过来可以容纳任何一个小部件或一个包含多个小部件的布局(例如 GridLayout 或 BoxLayout 等)。

这两个类都被定义在 kivy.uix.tabbedpanel 模块中。

from kivy.uix.tabbedpanel import TabbedPanel, TabbedPanelItem

构建标签页面板的流程图说明可能如下 −

main=TabbedPanel()
tab1=TabbedPanelItem(text='Tab 1')
Label=Label(text='Label')
tab1.add_widget(label)
tab2=TabbedPanelItem(text='Tab 2')
btn=Button(text="Button")
tab2.add_widget(btn)
main.add_widget(tab1)
main.add_widget(tab2)

可以通过调整几个属性进一步定制标签页面板 −

可以通过将 tab_pos 属性设置到以下任意值来选择选项卡的显示位置:left_top、left_mid、left_bottom、top_left、top_mid、top_right、right_top、right_mid、right_bottom、bottom_left、bottom_mid、bottom_right。

  1. 每个选项卡都有一个特殊按钮 TabbedPAnelHeader ,包含 content 属性。

  2. 选项卡面板带有默认选项卡,可以通过将 do_default_tab 设置为 False 来摆脱它。

如果显示默认选项卡,则提供一个 on_default_tab 事件用于关联一个回调 −

tp.bind(default_tab = my_default_tab_callback)

选项卡和内容可以通过以下几种方式来删除:

  1. tp.remove_widget() 删除选项卡及其内容。

  2. tp.clear_widgets() 清除内容区域中的所有小工具。

  3. tp.clear_tabs() removes the TabbedPanelHeaders

Example

在下面的示例中,我们使用了两个选项卡面板,第一个显示简单的注册表单,第二个显示登录表单。

我们应当使用“kv”语言脚本来构建设计。

  1. 默认选项卡已被删除。

  2. 第一个选项卡包含 2 列网格布局,包含标签和文本输入框,供用户输入其详细信息,然后是“Submit”按钮。

  3. 第二个选项卡也有一个两列网格,供已注册用户输入电子邮件和密码。

TabbedPanel:
   size_hint: .8, .8
   pos_hint: {'center_x': .5, 'center_y': .5}
   do_default_tab: False
   TabbedPanelItem:
      text:"Register Tab"
      GridLayout:
         cols:2
         Label:
            text:"Name"
            size_hint:(.2, .1)
            pos_hint:{'x':.2, 'y':.75}

         TextInput:
            size_hint:(.4, .1)
            pos_hint:{'x':.3, 'y':.65}

         Label:
            text:"email"
            size_hint:(.2, .1)
            pos_hint:{'x':.2, 'y':.55}

         TextInput:
            size_hint:(.4, .1)
            pos_hint:{'x':.3, 'y':.45}

         Label:
            text:"Password"
            size_hint:(.2, .1)
            pos_hint:{'x':.2, 'y':.35}

         TextInput:
            password:True
            size_hint:(.4, .1)
            pos:(400, 150)
            pos_hint:{'x':.3, 'y':.25}

         Button:
            text:'Submit'
            size_hint : (.2, .1)
            pos_hint : {'center_x':.5, 'center_y':.09}

   TabbedPanelItem:
      text:'Login Tab'
      GridLayout:
         cols:2

      Label:
         text:"email"
         size_hint:(.2, .1)
         pos_hint:{'x':.2, 'y':.55}

      TextInput:
         size_hint:(.4, .1)
         pos_hint:{'x':.3, 'y':.45}

      Label:
         text:"Password"
         size_hint:(.2, .1)
         pos_hint:{'x':.2, 'y':.35}

      TextInput:
         password:True
         size_hint:(.4, .1)
         pos:(400, 150)
         pos_hint:{'x':.3, 'y':.25}

      Button:
         text:'Submit'
         size_hint : (.2, .1)
         pos_hint : {'center_x':.5, 'center_y':.09}

利用上述“kv”脚本设计应用代码如下:

from kivy.app import App
from kivy.core.window import Window

Window.size = (720,300)

class TabDemoApp(App):
   def build(self):
      pass

TabDemoApp().run()

Output

运行上述代码时,应用程序窗口显示包含第一个选项卡内容的选项卡面板。单击“登录”选项卡以查看第二个选项卡的内容。

kivy login tab