我想从 python 文件中以 kivy builder 格式调用屏幕

I want to call a screen from python file in kivy builder format

基本上,我正在以生成器格式编写代码,但我需要为我的 table 屏幕使用 python 代码。我不知道如何在 kivy 字符串文件中执行按钮时调用 table 屏幕打开。这是相同的最小工作代码:

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp

Window.size = (350,600)

class FirstWindow(Screen):
    pass

class SecondWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass


kv="""
WindowManager:
    FirstWindow:

<FirstWindow>:
    name: "first"
    MDRoundFlatButton:
        text: "SIGN UP"
        font_size: 12
        pos_hint: {"center_x": 0.5,"center_y": 0.3}
        on_release: 
        
            app.root.current = "table" # I Want to call Table screen Here
            
            root.manager.transition.direction = "left"

"""

class MainApp(MDApp):
    def build(self):
        screen = Screen()
        table = MDDataTable(pos_hint={'center_x': 0.5, 'center_y': 0.5},size_hint=(0.9, 0.6),check=True,column_data=[("First Name", dp(30)),("Last Name", dp(30)),("Email Address", dp(30)),("Phone Number", dp(30))],row_data=[("John", "Elder", "zzz@xyz.com", "(123) 456-1111"),("Mary", "Elder", "yyy@xyz.com", "(123) 456-1111")])

        # Bind the table
        table.bind(on_check_press=self.checked)
        table.bind(on_row_press=self.row_checked)

        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_palette = "BlueGray"

        screen.add_widget(table)
        return Builder.load_string(kv) # the table screen should be called from within

    # Function for check presses
    def checked(self, instance_table, current_row):
        print(instance_table, current_row)

    # Function for row presses
    def row_checked(self, instance_table, instance_row):
        print(instance_table, instance_row)

MainApp().run()

项目信息: 我想link table 到网上资料库。其他功能不是动态的,所以我一直在 .kv 文件中对它们进行编码。第一个屏幕上的按钮应该会引导我进入 table 屏幕,但我无法对其进行编码。请帮忙

你犯了两个错误

  1. 你是不是没给网名'table'
  2. 您没有将屏幕添加到根小部件 所以这段代码应该适合你

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp

Window.size = (350, 600)


class FirstWindow(Screen):
    pass


class SecondWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


kv = """
WindowManager:
    FirstWindow:

<FirstWindow>:
    name: "first"
    MDRoundFlatButton:
        text: "SIGN UP"
        font_size: 12
        pos_hint: {"center_x": 0.5,"center_y": 0.3}
        on_release: 

            app.root.current = "table" # I Want to call Table screen Here

            root.manager.transition.direction = "left"

"""


class MainApp(MDApp):
    def build(self):
        # naming the screen
        screen = Screen(name='table')
        table = MDDataTable(pos_hint={'center_x': 0.5, 'center_y': 0.5}, size_hint=(0.9, 0.6), check=True,
                            column_data=[("First Name", dp(30)), ("Last Name", dp(30)), ("Email Address", dp(30)),
                                         ("Phone Number", dp(30))],
                            row_data=[("John", "Elder", "zzz@xyz.com", "(123) 456-1111"),
                                      ("Mary", "Elder", "yyy@xyz.com", "(123) 456-1111")])

        # Bind the table
        table.bind(on_check_press=self.checked)
        table.bind(on_row_press=self.row_checked)

        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_palette = "BlueGray"

        screen.add_widget(table)
        # load the root widget
        root= Builder.load_string(kv)  # the table screen should be called from within
        # add the screen to the root widget
        root.add_widget(screen)
        return root

    # Function for check presses
    def checked(self, instance_table, current_row):
        print(instance_table, current_row)

    # Function for row presses
    def row_checked(self, instance_table, instance_row):
        print(instance_table, instance_row)


MainApp().run()