【问题标题】:Kivy (Python) TabbedPanel - different (dynamic) sized tabs?Kivy(Python)TabbedPanel - 不同(动态)大小的标签?
【发布时间】:2018-02-10 05:52:50
【问题描述】:

Kivy 似乎想让所有标签的大小相同。 如果我想让一个标签比其他标签宽怎么办?调整 TabbedPanelItem 的 tab_width 似乎没有效果,因此较长的文本会被截断。

示例从 Kivy TabbedPanel docs 稍作修改,我将第一个选项卡的标题更改为“选项卡的长文本”:

from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.lang import Builder

Builder.load_string("""

<Test>:
    #size_hint: .5, .5
    pos_hint: {'center_x': .5, 'center_y': .5}
    do_default_tab: False

    TabbedPanelItem:
        text: 'Long Text for a Tab'
        tab_width: self.texture_size[0]
        Label:
            text: 'First tab content area'
    TabbedPanelItem:
        text: 'tab2'
        BoxLayout:
            Label:
                text: 'Second tab content area'
            Button:
                text: 'Button that does nothing'
    TabbedPanelItem:
        text: 'tab3'
        RstDocument:
            text:
                '\\n'.join(("Hello world", "-----------",
                "You are in the third tab."))

""")


class Test(TabbedPanel):
    pass


class TabbedPanelApp(App):
    def build(self):
        return Test()


if __name__ == '__main__':
    TabbedPanelApp().run()

...所以“长文本”被切掉了,因为所有 3 个选项卡的宽度都相同。即使将第一个选项卡的 tab_width 设置为常量(例如 300)也会被忽略。

似乎您可以向 TabbedPanel 提供 tab_width 并且它使所有选项卡都相同,但是如何使各个选项卡 (TabbedPanelItems) 具有不同(甚至是动态)宽度,即,使某些选项卡比其他选项卡更宽?

【问题讨论】:

    标签: python tabs kivy kivy-language


    【解决方案1】:

    tab_widthTabbedPanel 属性,而不是 TabbedPanelItem 属性,适用于所有选项卡。

    要为每个选项卡设置不同的大小,您可以将tab_widht 设置为None,然后正确使用TabbedPanelItem 属性(它基于Togglebutton,因此您可以使用size_hint_xsize 属性):

    <Test>:
        pos_hint: {'center_x': .5, 'center_y': .5}
        do_default_tab: False
        tab_width: None
    
        TabbedPanelItem:
            text: 'Long Text for a Tab'
            size_hint_x: None
            width: self.texture_size[0]
            padding: 10, 0
    
            Label:
                text: 'First tab content area'
    

    编辑:

    显然需要在TabbedPanel初始化后显式更新标签的宽度,可以使用Clock.schedule_once和on_tab_width方法来做到这一点:

    from kivy.app import App
    from kivy.uix.tabbedpanel import TabbedPanel, TabbedPanelItem
    from kivy.uix.boxlayout import BoxLayout
    from kivy.clock import Clock
    from kivy.lang import Builder
    
    Builder.load_string("""
    
    <CustomWidthTabb@TabbedPanelItem>
        width: self.texture_size[0]
        padding: 10, 0
        size_hint_x: None
    
    <Test>:
        size_hint: 1,1
        do_default_tab: False
        tab_width: None
    
        CustomWidthTabb:
            text: "This is a Long Tab"
            Label:
                text: 'First tab content area'
    
        CustomWidthTabb:
            text: "This is a Long Tab"
            Label:
                text: 'Second tab content area'
    
        CustomWidthTabb:
            text: "Short Tab"     
            Label:
                text: 'Third tab content area'
    
        CustomWidthTabb:
            text: "Short Tab#2"   
            Label:
                text: 'Fourth tab content area'
    
    """)
    
    
    
    class Test(TabbedPanel):
        def __init__(self, *args, **kwargs):
            super(Test, self).__init__(*args, **kwargs)
            Clock.schedule_once(self.on_tab_width, 0.1)
    
    class TabbedPanelApp(App):
        def build(self):
            return Test()
    
    
    if __name__ == '__main__':
        TabbedPanelApp().run()
    

    【讨论】:

    • 谢谢,这非常接近正确! ......然而,这是 3 个选项卡的特定选择的产物。 :( 尝试添加更多选项卡或使名称更长,当我尝试您的建议时,您可能会看到我刚刚得到的结果:为 4 个选项卡中的每一个复制这些类似的设置(“这是一个长选项卡”,“这是另一个长选项卡", "Short Tab", "Short Tab#2"),后面的标签会被“挤压”,所有标签都被挤到屏幕左侧 50% 的地方(未使用的黑色朝右,标签文本运行彼此相撞,甚至被切断)。把窗户放大也无济于事。
    • @sh37211 你说得对,看看版本。我不知道这是否是最好的选择。很遗憾,我现在没有时间调查这个问题,所以我可能会遗漏一些东西......
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多