首页 > 解决方案 > 将屏幕过渡方向应用于扩展面板和屏幕 kivy/kivymd 内的元素卡

问题描述

我是一个新程序员,正在开发一个Kivy应用程序,我需要使用screens (screen manager),问题是我使用元素卡作为按钮,并且假设使用on_release它时会改变屏幕,但是如果我包含root.manager.transition.direction = "left" 我得到错误 AttributeError: 'MyContentComunes' object has no attribute 'screen'. 我不知道是否有人可以帮助我解决这个问题。

这是一段代码。

from kivy.app import App
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivymd.uix.expansionpanel import MDExpansionPanel, MDExpansionPanelTwoLine
from kivy.core.window import Window
from kivymd.color_definitions import colors
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.screen import MDScreen

KV = '''

WindowManager:

    id: screen_manager

    PrincipalWindow:

    LenghtWindow:

<PrincipalWindow>:

    name: "principal"

    BoxLayout:

        MDToolbar:

            title: "Conversor"

            pos_hint: {"top": 1}

    ScrollView:

        pos_hint: {"center_x": .5, "center_y": .5}   #Ubicación

        size_hint: 0.90, 0.75

        GridLayout:

            halign: 'center'

            cols: 1

            adaptive_height: True

            id: box

<LenghtWindow>:

    name: "Lenght"

    md_bg_color: 0.34,0.024,0.292,1

    MDBoxLayout:

        orientation: "vertical"

        MDToolbar:

            title: "Conversor"

            pos_hint: {"top": 1} 


        Button:

            text: "Back"

            font_size: 32

            on_release: 

                app.root.current = "principal"

                root.manager.transition.direction = "right"


<MyContentComunes>:

    orientation: 'vertical'

    padding: dp(10)

    spacing: dp(10)

    size_hint_y: None

    height: self.minimum_height

    ElementCard:                     

        image:"1490820814-13_82405.png"

        text:"Longitud"

        id:longitud

        on_release: 

            app.root.current = "Lenght"

            root.manager.transition.direction = "left"

<ElementCard@MDCard>:

    md_bg_color: app.theme_cls.primary_color

    padding: dp(15)

    spacing: dp(15)

    size_hint: 1, None

    ripple_behavior: True

    # on_release: print("worked")   
             
    image:''

    text:""

    items_count:""

    subtext:''

    orientation: "vertical"

    Image:

        source:root.image

        halign:"center"

        padding: dp (4)

        spacing: dp(4)

    MDBoxLayout:

        orientation: "vertical"

        MDLabel:

            halign:"center"

            text:root.text 

        MDLabel:

            halign:"center"

            font_style:"Caption"
            
            text:root.subtext 

'''

Window.size = 324, 720

class Conversor(MDApp):

    def build(self):
        self.theme_cls.primary_palette = "Blue"
        return Builder.load_string(KV)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.list_items = []  # Dictionary where the items are stored
        self.category_list1 = ['Comunes']

    def on_start(self):
        for category in self.category_list1:
            self.root.get_screen('principal').ids.box.add_widget(
                MDExpansionPanel(
                    icon="3.png",
                    content=MyContentComunes(),
                    panel_cls=MDExpansionPanelTwoLine(
                        text=category,
                        secondary_text="Ver las unidades"
                    )
                )
            )


class MyContentComunes(BoxLayout):

    pass


class PrincipalWindow(Screen):

    pass

class LenghtWindow(Screen):

    pass

class WindowManager(ScreenManager):

    pass


Conversor().run()

元素卡在扩展面板内,扩展面板也在屏幕内。

标签: pythonkivyattributeerrorkivymd

解决方案


尝试添加Screen到类MyContentComunes

class MyContentComunes(BoxLayout, Screen):
    pass

我建议你像这样组织你的代码。它会让你的工作更轻松。

from kivy.app import App
from kivymd.app import MDApp
# import libraries ...

KV = '''
# Your KV File
'''

Window.size = 324, 720

class MyContentComunes(BoxLayout, Screen):
    pass


class PrincipalWindow(Screen):
    pass


class LenghtWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class Conversor(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Blue"
        return Builder.load_string(KV)

    def __init__(self, **kwargs):
        # Code
        .
        .
        .

    def on_start(self):
        # Code
        .
        .
        .


Conversor().run()

推荐阅读