为什么我的动态 Kivy MDDataTable 仅创建最多 5 行?

问题描述 投票:0回答:1

我正在创建一个简单的记分卡应用程序。我的

MDDataTable
是通过单击上一屏幕中的按钮动态创建的。

rounds
的值等于或小于 5 时,它可以正常工作,但是一旦它的值大于 5,则仅创建 5 行。

以下应该是最小的可重现示例:

from kivy.lang import Builder

from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem
from kivymd.uix.datatables import MDDataTable
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.metrics import dp


KV = '''
<NewGameWindow>:
    name: "new_game"

    MDBoxLayout:
        orientation: "vertical"
        
        MDTopAppBar:
            id: nav_bar
            title: "New Game"
            md_bg_color: app.theme_cls.primary_color
            left_action_items: [['close', lambda x: app.close()]]
            right_action_items: [['content-save-outline']]
        
        MDBoxLayout:
            orientation: "vertical"
            
            MDTextField:
                mode: "line"
                text: "New Game"
                pos_hint: {"center_x": 0.5}
                size_hint_x: 0.75

            MDLabel:
                text: "Number of Rounds:"
                size_hint_y: 0.1
                halign: "center"
                
            MDSlider:
                id: rounds
                step: 1
                value: 10
                track_color_active: app.theme_cls.primary_color
                size_hint_y: 0.1
                size_hint_x: 0.75
                pos_hint: {"center_x": 0.5}
                
            MDLabel:
                text: "Number of Players:"
                size_hint_y: 0.1
                halign: "center"
                
            MDSlider:
                id: players
                step: 1
                value: 10
                track_color_active: app.theme_cls.primary_color
                size_hint_y: 0.1
                size_hint_x: 0.75
                pos_hint: {"center_x": 0.5}
                
            Button:
                on_press: app.create_table()
       
<ScorecardWindow>:
    name: "scorecard"
     
    MDBoxLayout:
        orientation: "vertical"
        
        MDTopAppBar:
            id: nav_bar
            title: "Scorecard"
            md_bg_color: app.theme_cls.primary_color
        
        MDScrollView:
            id: add_table_to_scrollview
        
'''


class LandingWindow(Screen):
    pass


class NewGameWindow(Screen):
    pass


class ScorecardWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass
class Example(MDApp):

    def build(self):
        kv = Builder.load_string(KV)
        self.theme_cls.theme_style = "Light"
        self.sm = WindowManager()

        screens = [NewGameWindow(name="new_game"), ScorecardWindow(name="scorecard"),]
        for screen in screens:
            self.sm.add_widget(screen)

        self.sm.current = "new_game"
        return self.sm


    def create_table(self):
        rounds = self.root.get_screen("new_game").ids['rounds'].value
        players = self.root.get_screen("new_game").ids['players'].value
        players = int(players)
        rounds = int(rounds)
        print(players)
        print(rounds)
        round_list = [("0",) * players for _ in range(rounds)]
        print(round_list)
        table = MDDataTable(
            column_data=[(f"Player {x + 1}", dp(20)) for x in range(players)],
            row_data=round_list,
            on_row_press = self.open_popup
        )

        table.bind(on_row_press=self.open_popup)
        self.root.get_screen("scorecard").ids['add_table_to_scrollview'].add_widget(table)
        self.sm.current = "scorecard"
kivy kivymd
1个回答
0
投票

默认情况下,

MDDataTable
假设有 5 行。您需要使用
num_rows
指定实际行数。试试这个:

    table = MDDataTable(
        rows_num=len(round_list),
        column_data=[(f"Player {x + 1}", dp(20)) for x in range(players)],
        row_data=round_list,
        on_row_press = self.open_popup
    )
© www.soinside.com 2019 - 2024. All rights reserved.