add_widget и remove_widget для класса в киви

#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. См.Обновленный ответ.