【问题标题】:Adding functions to content navigation drawer向内容导航抽屉添加功能
【发布时间】:2021-06-17 23:50:45
【问题描述】:

我正在尝试向我的 kivymd 导航抽屉添加功能,但我找不到方法。我希望这些项目可以书写不同的页面。一个例子是设置项在点击时应该打开设置页面。我使用新更新的 kivymd 版本 0.103.0

这是一个示例代码

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty



class TestNavigationDrawer(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        icons_item = {
            "folder": "My files",
            "account-multiple": "Shared with me",
            "star": "Starred",
            "history": "Recent",
            "checkbox-marked": "Shared with me",
            "upload": "Upload",
        }
        for icon_name in icons_item.keys():
            self.root.ids.content_drawer.ids.md_list.add_widget(
                ItemDrawer(icon=icon_name, text=icons_item[icon_name])
            )

【问题讨论】:

  • 使用 on_release 设置一个动作。在最后一个字符串 ItemDrawer(icon=icon_name, text=icons_item[icon_name], on_release=...)

标签: python kivy kivy-language


【解决方案1】:

正如 Lothric 所说,您需要为 ItemDrawer 实例添加一个“on_release”属性。该属性的值应该是您希望在按下按钮时调用的任何函数(如果使用方法回调,通常是 lambda)。

不是你问的,但 KivyMD 在 GitLab 中有一个“kitchensink”演示应用程序,用于演示他们的一些小部件的功能。 Here's the link

【讨论】:

    【解决方案2】:

    另一种方法是简单地从类 TestNavigationDrawer() 中删除方法 on_start() 并在 .kv ScrollView 文件中编写代码以从一页切换到另一页。 我刚开始学习,所以我的代码可能不是最佳的,但它完全满足了所提到的要求。 即我正在粘贴完整的代码

    使用下面提供的示例代码:

    main.py

    from kivy.uix.boxlayout import BoxLayout
    from kivy.properties import StringProperty
    from kivy.properties import ObjectProperty
    
    from kivymd.app import MDApp
    from kivymd.theming import ThemableBehavior
    from kivymd.uix.list import OneLineIconListItem, MDList
    from kivymd.theming import  ThemeManager
    
    class ContentNavigationDrawer(BoxLayout):
        screen_manager = ObjectProperty()
        nav_drawer = ObjectProperty()
    
    
    class DrawerList(ThemableBehavior, MDList):
        def set_color_item(self, instance_item):
            '''Called when tap on a menu item.'''
            # Set the color of the icon and text for the menu item.
            for item in self.children:
                if item.text_color == self.theme_cls.primary_color:
                    item.text_color = self.theme_cls.text_color
                    break
            instance_item.text_color = self.theme_cls.primary_color
    
    
    class ItemDrawer(OneLineIconListItem):
        icon = StringProperty()
    
    
    class DrawerList(ThemableBehavior, MDList):
        def set_color_item(self, instance_item):
            """Called when tap on a menu item."""
    
            # Set the color of the icon and text for the menu item.
                for item in self.children:
                    if item.text_color == self.theme_cls.primary_color:
                    item.text_color = self.theme_cls.text_color
                    break
            instance_item.text_color = self.theme_cls.primary_color
    
    
    
    #GUI = Builder.load_file(r"C:\Users\main.kv")
    class MainApp(MDApp):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.theme_cls = ThemeManager()
    
        def build(self):
            self.theme_cls.theme_style = "Light"
            self.theme_cls.primary_palette = "Green"
            self.theme_cls.primary_hue = "200"
            #return GUI
    
    
    MainApp().run()
    

    main.kv

    #: include navigationdrawer.kv
    
    Screen:
        MDToolbar:
            id: toolbar
            pos_hint: {"top": 1}
            elevation: 10
            title: "Anything"
            left_action_items: [["menu", lambda x: nav_drawer.toggle_nav_drawer()]]
    
        NavigationLayout:
            x: toolbar.height
    
            ScreenManager:
                id: screen_manager
    
                Screen:
                    name: "scr 0"
                    MDLabel:
                        text: "Screen 0"
                        halign: "center"
    
                Screen:
                    name: "scr 1"
                    MDLabel:
                        text: "Screen 1"
                        halign: "center"
                Screen:
                    name: "scr 2"
                    MDLabel:
                        text: "Screen 2"
                        halign: "center"
    
    
            MDNavigationDrawer:
                id: nav_drawer
                ContentNavigationDrawer:
                    screen_manager: screen_manager
                    nav_drawer: nav_drawer
    

    navigationdrawer.kv

    <ItemDrawer>:
        theme_text_color: "Custom"
        on_release:
            print("HI IM Pringint" )
            self.parent.set_color_item(self)
    
        IconLeftWidget:
            id: icon
            icon: root.icon
            theme_text_color: "Custom"
            text_color: root.text_color
    
    
    <ContentNavigationDrawer>:
        orientation: "vertical"
        padding: "8dp"
        spacing: "8dp"
    
        AnchorLayout:
            anchor_x: "left"
            size_hint_y: None
            height: avatar.height
    
           Image:
                id: avatar
                #size_hint: None, None
                #size: "300dp", "300dp"
                source: "img/tiger.jpg"
    
        MDLabel:
            text: "All Starts Here!"
            font_style: "Button"
            size_hint_y: None
            height: self.texture_size[1]
    
        MDLabel:
            text: "Adding green energy to your life..."
            font_style: "Caption"
            size_hint_y: None
            height: self.texture_size[1]
    
        ScrollView:
    
    #        DrawerList:
    #            id: md_list
    
            MDList:
                id: md_list
                OneLineListItem:
                    text: "Screen 1"
                    on_press:
                        root.nav_drawer.set_state("close")
                        root.screen_manager.current = "scr 1"
    
                OneLineListItem:
                    text: "Screen 2"
                    on_press:
                        root.nav_drawer.set_state("close")
                        root.screen_manager.current = "scr 2"
    

    谢谢,希望对你有帮助!

    【讨论】:

      【解决方案3】:

      另一种解决方案

      我是一个绝对的初学者,我的解决方案可能不是最好的,甚至不是正确的。但它对我有用。

      我的 kivy、kivymd 和 python 版本:

      名称:基维 版本:2.0.0

      名称:kivymd 版本:0.104.1

      Python 3.8.5

      ma​​in.py

      from kivy.lang import Builder
      from kivy.uix.boxlayout import BoxLayout
      from kivy.properties import StringProperty, ListProperty
      
      from kivymd.app import MDApp
      from kivymd.theming import ThemableBehavior
      from kivymd.uix.list import OneLineIconListItem, MDList
      
      
      class NavigationDrawer(BoxLayout):
          pass
      
      
      class ContentNavigationDrawer(BoxLayout):
          pass
      
      
      class ItemDrawer(OneLineIconListItem):
          icon = StringProperty()
          text_color = ListProperty((0, 0, 0, 1))
      
      
      class DrawerList(ThemableBehavior, MDList):
          def set_color_item(self, instance_item):
              """Called when tap on a menu item."""
      
              # Set the color of the icon and text for the menu item.
              for item in self.children:
                  if item.text_color == self.theme_cls.primary_color:
                      item.text_color = self.theme_cls.text_color
                      break
              instance_item.text_color = self.theme_cls.primary_color
      
      
      class TestNavigationDrawer(MDApp):
          def build(self):
              return Builder.load_file('main.kv')
      
          def on_start(self):
              icons_item = {
                  "home": "Home",
                  "folder": "My files",
                  "account-multiple": "Shared with me",
                  "star": "Starred",
                  "history": "Recent",
                  "checkbox-marked": "Shared with others",
                  "upload": "Upload",
              }
              for icon_name in icons_item.keys():
                  self.root.ids.content_drawer.ids.md_list.add_widget(
                      ItemDrawer(icon=icon_name, text=icons_item[icon_name])
                  )
      
      
      TestNavigationDrawer().run()
      

      ma​​in.kv

      # Menu item in the DrawerList list.
      <ItemDrawer>:
          theme_text_color: "Custom"
          # on_press: self.parent.set_color_item(self)
          on_press:
              app.root.ids.nav_drawer.set_state("close")
              app.root.ids.screen_manager.current = self.text.lower()
          
      
          IconLeftWidget:
              id: icon
              icon: root.icon
              theme_text_color: "Custom"
              text_color: root.text_color
      
      
      <ContentNavigationDrawer>:
          orientation: "vertical"
          padding: "8dp"
          spacing: "8dp"
      
          AnchorLayout:
              anchor_x: "left"
              size_hint_y: None
              height: avatar.height
      
              Image:
                  id: avatar
                  size_hint: None, None
                  size: "56dp", "56dp"
                  source: "data/logo/kivy-icon-256.png"
      
          MDLabel:
              text: "KivyMD library"
              font_style: "Button"
              size_hint_y: None
              height: self.texture_size[1]
      
          MDLabel:
              text: "kivydevelopment@gmail.com"
              font_style: "Caption"
              size_hint_y: None
              height: self.texture_size[1]
      
          ScrollView:
      
              DrawerList:
                  id: md_list
      
      
      <NavigationDrawer>:
          orientation: 'vertical'
      
          MDToolbar:
              title: "Navigation Drawer"
              elevation: 10
              left_action_items: [["menu", lambda x: app.root.ids.nav_drawer.set_state("open")]]
      
          Widget:
      
      
      Screen:
      
          NavigationLayout:
      
              ScreenManager:
                  id: screen_manager
      
                  Screen:
                      name: "home"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "Home"
                              halign: "center"
      
                  Screen:
                      name: "my files"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "My Files"
                              halign: "center"
      
                  Screen:
                      name: "shared with me"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "Shared with me"
                              halign: "center"
      
                  Screen:
                      name: "starred"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "Starred"
                              halign: "center"
      
                  Screen:
                      name: "recent"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "Recent"
                              halign: "center"
      
                  Screen:
                      name: "shared with others"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "Shared with others"
                              halign: "center"
      
                  Screen:
                      name: "upload"
                      NavigationDrawer:
      
                      BoxLayout:
                          MDLabel:
                              text: "Upload"
                              halign: "center"
      
      
              MDNavigationDrawer:
                  id: nav_drawer
      
                  ContentNavigationDrawer:
                      id: content_drawer
      

      【讨论】:

        【解决方案4】:

        如何为内容添加功能的简短示例;

        # .py file
        class ItemDrawer(OneLineIconListItem):
            icon = StringProperty()
        
            def upload(self):
                if self.icon == "upload":
                    print("Item uploaded")
        
        # .kv file
        <ItemDrawer>:
            on_release: root.upload()
        

        【讨论】:

          猜你喜欢
          • 2016-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多