У объекта AttributeError 'Button' нет атрибута scrlFBtn - PullRequest
0 голосов
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from kivy.effects.scroll import ScrollEffect
from kivy.uix.widget import Widget
from kivy.uix.button import Button

class BSGameMain:
    def sas(self):
        # blmain.remove_widget(scrlFBtns)
        self.scrlFBtns.remove_widget(blbtns)

    blmain = BoxLayout(orientation = 'vertical') # MainBoxLayout init

    scrlFBtns = ScrollView(effect_cls = 'ScrollEffect')

    blbtns = BoxLayout(
        orientation = 'vertical',
        size_hint_y = None
        ) # BoxLayout for buttons

    blbtns.bind(minimum_height = blbtns.setter('height'))
    scrlFBtns.add_widget(blbtns)

    for i in range (2):
        blbtns.add_widget(Button(
            text='asd',
            size_hint_y = None,
            height = 40,
            on_press = sas
            ))

    lblmain = Label(text = 'asd')
    blmain.add_widget(lblmain)
    blmain.add_widget(scrlFBtns)


class BSApp(App):
    def build(self):
        game = BSGameMain()
        return game.blmain

if __name__ == "__main__":
    BSApp().run()

Объект AttributeError 'Button' не имеет атрибута scrlFBtn.В чем проблема?Я пытаюсь сделать так, чтобы при щелчке экран очищался (виджет был удален).Помогите пожалуйста =)

1 Ответ

0 голосов
/ 19 мая 2018

В вашем коде есть несколько ошибок и неправильных методов программирования:

  • , если вы объявите переменные, которые находятся внутри класса и вне какого-либо метода класса, будут переменными класса, а не атрибутами атрибутакласс, так что не рекомендуется делать это, если вы хотите использовать позже self, весь этот код должен быть в методе класса.

  • on_someproperty waitВ качестве параметра функция, которая получает параметры, в вашем случае sas() не получает их, поэтому решение заключается в использовании лямбда-метода.


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.effects.scroll import ScrollEffect
from kivy.uix.button import Button

class BSGameMain:
    def __init__(self):
        self.blmain = BoxLayout(orientation = 'vertical') # MainBoxLayout init

        self.scrlFBtns = ScrollView(effect_cls = 'ScrollEffect')

        self.blbtns = BoxLayout(
            orientation = 'vertical',
            size_hint_y = None )

        self.blbtns.bind(minimum_height = self.blbtns.setter('height'))
        self.scrlFBtns.add_widget(self.blbtns)

        for i in range(2):
            self.blbtns.add_widget(Button(
                text='asd',
                size_hint_y = None,
                height = 40,
                on_press = lambda *args: self.sas()))

        lblmain = Label(text = 'asd')
        self.blmain.add_widget(lblmain)
        self.blmain.add_widget(self.scrlFBtns)

    def sas(self):
        self.scrlFBtns.remove_widget(self.blbtns)


class BSApp(App):
    def build(self):
        game = BSGameMain()
        return game.blmain

if __name__ == "__main__":
    BSApp().run()
...