首页 > 解决方案 > 如何在kivy的tabbedpanel小部件中启用动态创建的选项卡的滚动?

问题描述

我的 kivy 应用程序包含一个主屏幕和另外 10 个屏幕。主屏幕有一个带有 5 个选项卡的选项卡式面板小部件。每个选项卡代表一个组,每个组有两个按钮,代表两个屏幕。在按钮按下事件上,将加载相应的屏幕。

我的代码中没有错误。但是,选项卡式面板中仅显示少数选项卡。请建议我如何在选项卡式面板小部件中创建可滚动选项卡。我参考了文档并遇到了 switch_to 函数,但没有说明如何使用它。

tst.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.tabbedpanel import TabbedPanelItem
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class windowManager(ScreenManager):
    pass

class MainScreen(Screen):
    mytabs = ObjectProperty(None)
    category = {'Group 1':['Screen 1', 'Screen 2'],
                'Group 2': ['Screen 3', 'Screen 4'],
                'Group 3': ['Screen 5', 'Screen 6'],
                'Group 4': ['Screen 7', 'Screen 8'],
                'Group 5': ['Screen 9', 'Screen 10']
                }

    tabs = []
    buttons = []

    def add_tabs(self):
        for item in self.category:
            self.tabs.append(TabbedPanelItem(text = item))
            button_grid = BoxLayout(orientation = 'vertical')   
            for value in self.category[item]:
                self.buttons.append(Button(text = value))
                button_grid.add_widget(self.buttons[-1])
            self.tabs[-1].add_widget(button_grid)
            self.mytabs.add_widget(self.tabs[-1])
        for i in self.buttons:
            i.bind(on_press = self.navigate)

    def navigate(self,instance):
        self.manager.current = instance.text

class Screen1(Screen):    
    pass

class Screen2(Screen):    
    pass

class Screen3(Screen):    
    pass

class Screen4(Screen):    
    pass

class Screen5(Screen):    
    pass

class Screen6(Screen):    
    pass

class Screen7(Screen):    
    pass

class Screen8(Screen):    
    pass

class Screen9(Screen):    
    pass

class Screen10(Screen):    
    pass

class Docky(App):                
    def build(self):    
        return windowManager()            

if __name__=="__main__":
    Docky().run()

Docky.kv

# File: docapp.py

<WindowManager>:
    MainScreen:
    Screen1:
    Screen2:
    Screen3:
    Screen4:
    Screen5:
    Screen6:
    Screen7:
    Screen8:
    Screen9:
    Screen10:

<MainScreen>:
    name: 'main'
    mytabs: my_tabs


    TabbedPanel:
        id: my_tabs
        tab_pos: 'left_top'
        tab_width: 150
        size_hint: 1, 1
        do_default_tab: False
        on_kv_post:
            root.add_tabs()



<Screen1>:
    name: 'Screen 1'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 1'
            #size_hint: None, 0.8
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'


<Screen2>:
    name: 'Screen 2'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 2'
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'

<Screen3>:
    name: 'Screen 3'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 3'
            #size_hint: None, 0.8
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'


<Screen4>:
    name: 'Screen 4'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 4'
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'

<Screen5>:
    name: 'Screen 5'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 5'
            #size_hint: None, 0.8
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'


<Screen6>:
    name: 'Screen 6'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 6'
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'

<Screen7>:
    name: 'Screen 7'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 7'
            #size_hint: None, 0.8
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'


<Screen8>:
    name: 'Screen 8'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 8'
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'

<Screen9>:
    name: 'Screen 9'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 9'
            #size_hint: None, 0.8
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'


<Screen10>:
    name: 'Screen 10'
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'this is screen 10'
        Button: 
            text: 'Back to main screen'
            size_hint: 1, 0.2
            on_press: app.root.current = 'main'

标签: pythonkivykivy-language

解决方案


推荐阅读