Как запрограммировать повторно используемую кнопку в KivyMD?

#python #kivy #kivy-language #kivymd

#python #kivy #kivy-язык #kivymd

Вопрос:

Я пытаюсь создать «BackButton», который будет присутствовать на нескольких экранах, будет иметь одинаковый значок, цвет и положение и всегда будет выполнять одно и то же действие (отправлять пользователя на предыдущую страницу). Чтобы уменьшить вероятность ошибки и для экономии времени, я хотел бы запрограммировать ее один раз, а затем загрузить при необходимости из файла .kv. Вот упрощенный пример того, что я хочу сделать.

main.py

 from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.button import MDIconButton

class HomeScreen(Screen):
    pass

class ProfileScreen(Screen):
    pass

sm = ScreenManager()
sm.add_widget(HomeScreen(name='home'))
sm.add_widget(ProfileScreen(name='profile'))

class DemoApp(MDApp):
    def build(self):
        screen = Builder.load_file('main.kv')
        return screen

DemoApp().run()
  

main.kv

 #: include kv/homescreen.kv
#: include kv/profilescreen.kv
#: include kv/button.kv

ScreenManager:
    HomeScreen:
    ProfileScreen:
  

kv/homescreen.kv

 <HomeScreen>:
    name: 'home'
    MDIconButton:
        icon: 'account'
        pos_hint: {'center_x':0.5,'center_y':0.6}
        on_press: root.manager.current = 'profile'
        on_press: root.manager.transition.direction = 'left'
  

kv/profile.kv

 <ProfileScreen>:
    name: 'profile'
    MDLabel:
        text: 'profile'
        halign: 'center'
    BackButton:
  

button.kv

 <BackButton>:
    MDIconButton:
        icon: 'arrow-left-thick'
        pos_hint: {'center_x':0.5,'center_y':0.1}
        on_press: root.manager.transition.direction = 'right'
        on_press: root.manager.current = 'DESTINATION'
  

Всякий раз, когда я запускаю это, я получаю:

 AttributeError: 'BackButton' object has no attribute 'manager
  

чего я не понимаю. Кнопка должна иметь возможность принимать переменную для root.manager.current, поскольку это будет единственная переменная, которая будет меняться от экрана к экрану. У кого-нибудь есть предложения?

Ответ №1:

root Переменная является предопределенной переменной в kv , которая ссылается на корень заключающего правила. Итак, ваш root в этом kv файле ссылается на BackButton , у которого нет manager атрибута. Попробуйте это:

 <BackButton>:
    MDIconButton:
        icon: 'arrow-left-thick'
        pos_hint: {'center_x':0.5,'center_y':0.1}
        on_press: app.root.manager.transition.direction = 'right'
        on_press: app.root.manager.current = 'DESTINATION'
  

Также app является предопределенной kv переменной, которая ссылается на текущую App , и приложение имеет root ScreenManager значение, которое вы назначили.