首页 > 解决方案 > 我想以 kivy builder 格式从 python 文件调用屏幕

问题描述

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

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()

关于项目的信息:我想将表链接到在线数据库。其他功能不是动态的,所以我一直在 .kv 文件中对它们进行编码。第一个屏幕上的按钮应将我引导至表格屏幕,但我无法对其进行编码。请帮忙。

标签: pythonkivykivy-languagekivymd

解决方案


你犯了两个错误

  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()




推荐阅读