(Kivy)从App类调用函数 - 函数对象没有属性

时间:2017-07-19 01:38:33

标签: python class methods kivy

这可能是完全解决这个问题的错误方法,所以我愿意接受其他建议。我试图通过按下按钮更改另一个类中按钮的背景。按钮.kv在这里:

do {
    let object = try JSONSerialization.jsonObject(with: arrayJson, options: .mutableContainers)
    if let array = object as? NSArray {
        print("got an array of \(array.count) elements")
    } else if let dictionary = object as? NSDictionary {
        print("got a dictionary with keys: \(dictionary.allKeys)")
    }
} catch {
    print(error)
}

以下是它所指的app类:

Button:
            root: 'landing_sc'
            id: filebutton
            size: 150, 150
            size_hint: None, None
            background_normal: 'folder.png'
            background_down: 'opacity.png'
            pos_hint: {'x': 0.11, 'top': .7}
            on_release: 
                root.manager.transition = FadeTransition()
                root.manager.transition.duration = 1.5
                root.IfFolder()
                root.ChangeToSlide()
                app.switch.change()

最后,这里是我尝试在LandingScreen类中使用的方法来更改按钮的背景:

class MySubApp(App):
    def switch(self):
        change = LandingScreen()

    def build(self):
        return MyScreenManager()

这似乎是一项大规模的工作,无论如何都无法正常工作。是否有更简单的方法来更改另一个类on_release中按钮的属性?谢谢。

1 个答案:

答案 0 :(得分:0)

您可以通过很多方式实现这一目标。一种方法是使用property,如下所示。另外,如果您想知道为什么没有获得预期的颜色,请阅读This Q和A.

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.properties import BooleanProperty
from kivy.lang import Builder

Builder.load_string("""
<MyButton>:
    background_color: [1, 0, 0, 1] if self.active else [1, 1, 1, 1]

<RootWidget>:
    orientation: "vertical"
    GridLayout:
        cols: 2
        size_hint: (1, .2)
        MyButton:
            text: "Screen One"
            on_release: root.sm.current = "one"
            active: root.sm.current == "one"
        MyButton:
            text: "Screen Two"
            on_release: root.sm.current = "two"
            active: root.sm.current == "two"
""")


class MyButton(Button):
    active = BooleanProperty(None)


class Manager(ScreenManager):

    def __init__(self, *args, **kwargs):
        super(Manager, self).__init__(*args, **kwargs)

        screen_one = Screen(name="one")
        screen_one.add_widget(Label(text="Screen One"))

        screen_two = Screen(name="two")
        screen_two.add_widget(Label(text="Screen Two"))

        self.add_widget(screen_one)
        self.add_widget(screen_two)


class RootWidget(BoxLayout):

    def __init__(self, *args, **kwargs):
        self.sm = Manager()
        super(RootWidget, self).__init__(*args, **kwargs)
        self.add_widget(self.sm)


class TestApp(App):

    def build(App):
        return RootWidget()


if __name__ == '__main__':
    TestApp().run()