#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
значение, которое вы назначили.