(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 类调用函数 - 函数对象没有属性的主要内容,如果未能解决你的问题,请参考以下文章