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

Posted

技术标签:

【中文标题】(Kivy) 从 App 类调用函数 - 函数对象没有属性【英文标题】:(Kivy) Calling Function From App Class - Function Object Has no Attribute 【发布时间】:2017-12-24 01:55:51 【问题描述】:

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

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()

这是它所指的应用程序类:

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

    def build(self):
        return MyScreenManager()

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

class LandingScreen(Screen):
    def __init__(self, **kwargs):
        super(LandingScreen, self).__init__(**kwargs)
        self.buttons = [] # add references to all buttons here
        Clock.schedule_once(self._finish_init)

def callfun(self, *args):
    self.ChangePic()

    def ChangePic(self, *args):
            self.buttons[1].background_normal = 'folder.png'

这似乎是一项庞大的工作,无论如何都行不通。有没有更简单的方法来更改另一个类 on_release 中按钮的属性?谢谢。

【问题讨论】:

如果以下答案正确,请采纳。谢谢。 【参考方案1】:

有很多方法可以实现这一目标。一种方法是使用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()

【讨论】:

以上是关于(Kivy) 从 App 类调用函数 - 函数对象没有属性的主要内容,如果未能解决你的问题,请参考以下文章

输入直到离开kivy时如何调用函数?

python - kivy:从另一个类调用函数

使用 Kivy 的 Python 跨类函数调用

Kivy 在另一个类中调用函数

Python / Kivy - 在调用函数的另一个屏幕中替换标签的值

Python / Kivy - 在另一个调用函数的屏幕中替换标签的值