【问题标题】:Add a command to a button inside a screen kivy向屏幕kivy内的按钮添加命令
【发布时间】:2022-01-21 12:53:31
【问题描述】:

我想制作一个带有 kivy 的应用程序,它具有屏幕管理和导航抽屉。当我按下按钮时,它向我显示此错误:“AttributeError:'Screen'对象没有属性'mas'” mas 是命令的名称。这是代码

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
from plyer import notification
from kivymd.app import MDApp
from datetime import *

KV = '''
<ContentNavigationDrawer>:
    ScrollView:
        MDList:
            OneLineListItem:
                text: "Accueil"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "acc"
        
            OneLineListItem:
                text: "Comment ça marche ?"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "scr 1"

            OneLineListItem:
                text: "Les infections nosocomiales"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "scr 2"
            OneLineListItem:
                text: "Aidez-nous à améliorer l'application"
                on_press:
                    root.nav_drawer.set_state("close")
                    root.screen_manager.current = "aaa"


Screen:

    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 10
        title: "STOP-IN"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]

    MDNavigationLayout:
        x: toolbar.height

        ScreenManager:
            id: screen_manager

            Screen:
                name: 'acc'
                BoxLayout:
                    orientation: 'vertical'
                    padding:50
                    spacing:10
                    
                    MDLabel:
                        text: ' Lavage/Désinfections des mains'
                    MDSwitch:
                        active: True
                        on_active: root.lav(self, self.active)
                        
                    MDLabel:
                        text: ' Changement de masque'
                    MDSwitch:
                        active: True
                        on_active: root.mas(self, self.active)
                    MDLabel:
                        text: ' Changement de blouse'
                    MDSwitch:
                        active: True
                        on_active: root.blo(self, self.active)

            Screen:
                name: "scr 1"

                Image:
                    source: 'ccm.jpg'

            Screen:
                name: "scr 2"

                Image:
                    source: 'lis.jpg'

            Screen:
                name: "aaa"
                GridLayout:
                    padding:50
                    cols:1
                    size: root.width, root.height
                    MDTextField:
                        id: txt
                        multiline: True
                        hint_text: "Comment pourrions améliorer l'application ?"
                    MDFlatButton:
                        text: 'Envoyer'
                        on_press: root.cl(self)
                        

        MDNavigationDrawer:
            id: nav_drawer

            ContentNavigationDrawer:
                screen_manager: screen_manager
                nav_drawer: nav_drawer
'''


class ContentNavigationDrawer(BoxLayout):
    screen_manager = ObjectProperty()
    nav_drawer = ObjectProperty()
    def cl(self, *args):
        txt.text = ""
    def lav(self, switchObject, switchValue):
        if switchValue == True:
            time = datetime.strptime("03/02/21 16:30", "%d/%m/%y %H:%M")
            f = time.minute + 20
            while True:
                time = datetime.strptime("03/02/21 16:30", "%d/%m/%y %H:%M")
                if time.minute == future:
                    notification.notify(title="Lavez-vous les mains!",icon="kivy_logo", message="Lavez-vous les mains!", timeout=1200)
    def mas(self, switchObject, switchValue):
        if switchValue == True:
            time = datetime.strptime("03/02/21 16:30", "%d/%m/%y %H:%M")
            f = time.hour + 2
            futuremin = time.minute
            while True:
                time = datetime.strptime("03/02/21 16:30", "%d/%m/%y %H:%M")
                if time.hour == future and time.minute == futuremin:
                    notification.notify(title="Changez de masque!",icon="kivy_logo", message="Il est temps de changer de masque!", timeout=12000)
    def blo(self, switchObject, switchValue):
        if switchValue == True:
            time = datetime.strptime("03/02/21 16:30", "%d/%m/%y %H:%M")
            f = time.hour + 2
            futuremin = time.minute
            while True:
                time = datetime.strptime("03/02/21 16:30", "%d/%m/%y %H:%M")
                if time.hour == future and time.minute == futuremin:
                    notification.notify(title="Changez de blouse!",icon="kivy_logo", message="Il est temps de changer de blouse!", timeout=12000)
                if time.hour == 12 and time.minute == 30:
                    notification.notify(title="Enlevez votre blouse!",icon="kivy_logo", message="Enlevez votre blouse avant d'aller à la buvette!", timeout=12000)
    

class TestNavigationDrawer(MDApp):
    def build(self):
        self.icon = 'log'
        return Builder.load_string(KV)



TestNavigationDrawer().run()
当我单击开关或按钮时,它会显示错误并关闭窗口

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

    在您的kv 中,on_active: root.mas(self, self.active) 中的root 指的是当前规则的root,即Screen。由于Screen 中没有mas() 方法,因此您会收到该错误。解决方法是将root 替换为正确的项目。首先,您可以将id 添加到ContentNavigationDrawer,如下所示:

            ContentNavigationDrawer:
                id: cnd
                screen_manager: screen_manager
                nav_drawer: nav_drawer
    

    然后您可以使用 id 代替 root,例如:

                    MDSwitch:
                        active: True
                        on_active: cnd.mas(self, self.active)
    

    当然,你需要对ContentNavigationDrawer中其他方法的引用做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多