#python #kivy #kivy-language #kivymd
Вопрос:
Я новичок в Киви, прошу прощения за то, что задал 2 вопроса в одном посте..
Во-первых, почему remove_widget()
это не работает? В нем говорилось AttributeError: 'MyCard' object has no attribute 'remove_card'
, но я пытался перевести их в другие классы, и это все равно не работает.
Во-вторых, почему мои виджеты все еще имеют «поведение фокусировки», а мои кнопки по-прежнему доступны для нажатия, даже когда я помещаю карту, цвет которой немного прозрачен
Это мое main.py файл
class MyCard(Screen): pass class HomeScreen(Screen): def add_card(self): self.add_widget(MyCard()) def remove_card(self): self.remove_widget(MyCard(name='cardd')) class AVCard(Screen): pass class ScreenApp(MDApp): def build(self): def build(self): sm = ScreenManager(transition=FadeTransition(duration=0.2)) sm.add_widget(HomeScreen(name='home')) sm.add_widget(AVCard(name='av')) return sm
а это мой файл home.kv (класс AVCard имеет свой собственный файл .kv)
lt;HomeScreengt;: name: 'home' MDIconButton: on_release: root.add_card() ... lt;MyCardgt;: name: 'cardd' MDCard: #-gt; I put this card is to not allow user click on widgets behind it but it does not work md_bg_color: 0, 0, 0, .3 ... MDCard: #-gt; Thís card is like a window which includes small widgets in it ... Screen: MDIconButton: #-gt; The close button icon: "close-circle" ... on_release: root.remove_card()
Большое спасибо.
Ответ №1:
В вашем kv
, root.remove_card()
то пытается ссылаться на remove_card()
метод root
. В данном случае root
относится к корню правила, в котором оно появляется, которое является MyCard
. Вот почему вы видите сообщение об ошибке, remove_card()
которого нет в MyCard
объекте. Исправление состоит в том, чтобы использовать ссылку на правильный объект, который содержит remove_card()
метод, например:
lt;MyCardgt;: MDCard: #-gt; I put this card is to not allow user click on widgets behind it but it does not work md_bg_color: 0, 0, 0, .3 MDCard: #-gt; Thís card is like a window which includes small widgets in it Screen: MDIconButton: #-gt; The close button icon: "close-circle" on_release: app.root.get_screen('home').remove_card(root)
Обратите внимание на использование app.root.get_screen('home').remove_card(root)
, это получает ссылку на HomeScreen
объект (при name
условии, что используется home
) и вызывает его remove_card()
метод с root
( MyCard
экземпляром) в качестве аргумента.
Затем в HomeScreen
классе remove_card()
метод может быть:
def remove_card(self, card): self.remove_widget(card)
Комментарии:
1. мой
HomeScreen
идентификатор естьhome
, и я использовалapp.root.get_screen('home').remove_card()
его, как и вы, но когда я нажал на кнопку «Закрыть», он не исчез..2. У
Screens
каждого из вас должен бытьname
атрибут (не говоряids
здесь о нем).3. Это все еще не работает.. Извините за мою глупость, сэр.. обновил свой код, не могли бы вы взглянуть?.. Большое спасибо!.
4. См.Обновленный ответ.