KivyMD добавляет виджет к одному элементу / экрану MDBottomNavigation

Недавно я опубликовал сообщение о добавлении виджета индикатора выполнения на экран, но поскольку моя MDBottomNavigation содержится в одном экране, каждый раз, когда я переключаюсь на другой элемент в нижней навигации, индикатор выполнения остается. Итак, я хочу вместо этого добавить индикатор выполнения только к одному из элементов MDBottomNavigation, а не к другому 2. Вот мой код:

.py файл

class WindowManager(ScreenManager):
    pass 

class HomeScreen(Screen):
   pass

class MyWorkouts(Screen):
    pass

class RecommendedWorkouts(Screen):
    pass

class AddWorkouts(Screen):
    pass

class CreateNewWorkout(Screen):
    pass

class AddNewGoal(Screen):
    pass

class Goals(Screen):
    pass

class Workout(MDApp):
    dialog = None
    PB = ObjectProperty(None)

def build(self):
    return 

def AddNewGoal_Dialog(self):
    if not self.dialog:
        self.dialog = MDDialog(
            size_hint_x = 0.8,
            size_hint_y = 1,
            pos_hint = {'center_x': .5, 'center_y': .5},
            radius = [10, 10, 10, 10],
            title = 'Add New Goal',
            auto_dismiss = False,
            type = 'custom',
            content_cls = AddNewGoal(),
            buttons = [
                MDFlatButton(
                    text = 'CANCEL', text_color = self.theme_cls.primary_color, 
                    on_release = self.closeDialog),
                MDRaisedButton(
                    text = 'CREATE', text_color = self.theme_cls.primary_color,
                    on_release = self.addNewGoal)
                    
                ],
        )
    self.dialog.open()

def addNewGoal(self, inst):
    progressbar = ProgressBar(
    value = 50,
    max = 100
    )

    self.root.ids.GoalsBN.add_widget(progressbar)
    self.dialog.dismiss()

.kv файл

WindowManager:
    transition: FadeTransition(duration = 1)
HomeScreen:

MyWorkouts:

RecommendedWorkouts:

AddWorkouts:

CreateNewWorkout:

AddNewGoal:

Goals:


<HomeScreen>
    name: 'HomeScreen'


MDBottomNavigation:
    MDBottomNavigationItem:
        text: 'Workouts'
        name: 'Workouts'
        icon: 'weight-lifter'

        FloatLayout:
            canvas:
                Color:
                    #rgba: 0.2, 0.4, 0.75, 0.8
                    rgba: 0, 0, 0.5, 0.9
                Rectangle:
                    pos: self.pos
                    size: self.size


            MDFillRoundFlatIconButton:
                text: 'My Workouts'
                text_color: 0, 0, 0, 1
                font_size: '12sp'
                icon: 'weight-lifter'
                pos_hint: {'x': 0.15, 'top': 0.7}
                size_hint: 0.7, 0.1

        
                on_release:
                    app.root.current  = 'MyWorkouts' 


            MDFillRoundFlatIconButton:
                text: 'Recommended Workouts'
                text_color: 0, 0, 0, 1
                font_size: '12sp'
                icon: 'weight-kilogram'
                pos_hint: {'x': 0.15, 'top': 0.5}
                size_hint: 0.7, 0.1
                background_normal: 'white.jpg'

                on_release:
                    app.root.current = 'RecommendedWorkouts'
            
        GridLayout:
            cols: 1

            MDToolbar:
                title: 'App Attack'
                type: 'top'
                #md_bg_color: app.theme_cls.accent_color
                elevation: 10

    
    MDBottomNavigationItem:
        text: 'Goals'
        id: 'GoalsBN'
        name: 'GoalsBN'
        icon: 'trending-up'


        FloatLayout:
            canvas:
                Color:
                    #rgba: 0.2, 0.4, 0.75, 0.8
                    rgba: 0, 0, 0.5, 0.9
                Rectangle:
                    pos: self.pos
                    size: self.size
                    

            GridLayout:
                cols: 1

                MDToolbar:
                    title: 'App Attack'
                    type: 'top'
                    #md_bg_color: app.theme_cls.accent_color
                    elevation: 10
                    right_action_items: [['plus-circle-outline', lambda x: app.AddNewGoal_Dialog()]]



    MDBottomNavigationItem:
        text: 'Profile'
        name: 'Profile'
        icon: 'account'

        FloatLayout:
            canvas:
                Color:
                    rgba: 0, 0, 0.5, 0.9
                Rectangle:
                    pos: self.pos
                    size: self.size

        GridLayout:
            cols: 1

            MDToolbar:
                title: 'App Attack'
                type: 'top'
                #md_bg_color: app.theme_cls.accent_color
                elevation: 10 

Строка в .py файла из

self.root.ids.GoalsBN.add_widget(progressbar)

это то место, где нужно сделать редактирование. Я знаю, что эта строка неправильная, я просто не знаю, как вызвать MDBottomNavigationItem, которому я дал идентификатор: GoalsBN. Помощь будет очень признательна!

1 ответ

Решение

Проблемы

  1. В файле kv идентификатор GoalsBN определяется как строка.
  2. ID: 'GoalsBN' определяется в Homescreen, но не определены в ScreenManager, WindowManager:.

Решения

  1. В файле kv id: не является строкой. Поэтому заменить идентификатор: "GoalsBN" с идентификатором: GoalsBN
  2. В файле kv добавьте id: homeScreen, а в скрипте Python добавьте ids.homeScreen в self.root.ids.GoalsBN.add_widget(индикатор выполнения)

Фрагменты

kv файл

WindowManager:
    transition: FadeTransition(duration = 1)
    HomeScreen:
        id: homeScreen

    MyWorkouts:
    ...
        MDBottomNavigationItem:
            text: 'Goals'
            id: GoalsBN
            ...

main.py

    def addNewGoal(self, inst):
        progressbar = ProgressBar(
            value=50,
            max=100
        )

        self.root.ids.homeScreen.ids.GoalsBN.add_widget(progressbar)
        self.dialog.dismiss()

Выход

Другие вопросы по тегам