标签页#

元素 ui.tabsui.tabui.tab_panelsui.tab_panel 类似于 Quasar 的标签页标签面板 API。

ui.tabs 创建一个容器来容纳标签页。例如,它可以放置在一个 ui.header 中。ui.tab_panels 创建一个带有实际内容的标签面板的容器。每个 ui.tab_panel 都与一个 ui.tab 元素相关联。

from nicegui import ui

with ui.tabs().classes('w-full') as tabs:
    one = ui.tab('One')
    two = ui.tab('Two')
with ui.tab_panels(tabs, value=two).classes('w-full'):
    with ui.tab_panel(one):
        ui.label('First tab')
    with ui.tab_panel(two):
        ui.label('Second tab')

# ui.run()

名称、标签、图标#

ui.tab 元素具有一个 label 属性,可用于显示与 name 不同的文本。name 也可以代替 ui.tab 对象,将 ui.tabui.tab_panel 关联起来。此外,每个标签页都可以有一个图标。

from nicegui import ui

with ui.tabs() as tabs:
    ui.tab('h', label='Home', icon='home')
    ui.tab('a', label='About', icon='info')
with ui.tab_panels(tabs, value='h').classes('w-full'):
    with ui.tab_panel('h'):
        ui.label('Main Content')
    with ui.tab_panel('a'):
        ui.label('Infos')

# ui.run()

通过编程切换标签页#

ui.tabsui.tab_panels 元素派生自 ValueElement,它具有 set_value 方法。可以使用该方法通过编程方式切换标签页。

from nicegui import ui

content = {'Tab 1': 'Content 1', 'Tab 2': 'Content 2', 'Tab 3': 'Content 3'}
with ui.tabs() as tabs:
    for title in content:
        ui.tab(title)
with ui.tab_panels(tabs).classes('w-full') as panels:
    for title, text in content.items():
        with ui.tab_panel(title):
            ui.label(text)

ui.button('GoTo 1', on_click=lambda: panels.set_value('Tab 1'))
ui.button('GoTo 2', on_click=lambda: tabs.set_value('Tab 2'))

# ui.run()
<nicegui.elements.button.Button at 0x7fad0cff0820>

带有分隔符的垂直标签页#

Quasar 的垂直标签页示例类似,我们可以将 ui.splitter 和 tab 元素结合起来创建一个垂直标签页布局。

from nicegui import ui

with ui.splitter(value=30).classes('w-full h-56') as splitter:
    with splitter.before:
        with ui.tabs().props('vertical').classes('w-full') as tabs:
            mail = ui.tab('Mails', icon='mail')
            alarm = ui.tab('Alarms', icon='alarm')
            movie = ui.tab('Movies', icon='movie')
    with splitter.after:
        with ui.tab_panels(tabs, value=mail) \
                .props('vertical').classes('w-full h-full'):
            with ui.tab_panel(mail):
                ui.label('Mails').classes('text-h4')
                ui.label('Content of mails')
            with ui.tab_panel(alarm):
                ui.label('Alarms').classes('text-h4')
                ui.label('Content of alarms')
            with ui.tab_panel(movie):
                ui.label('Movies').classes('text-h4')
                ui.label('Content of movies')

# ui.run()