如何从 kivy 中的 python 脚本访问 kv 中的属性



以下是 main.py:

from kivy.app import App
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.screenmanager import (ScreenManager, Screen)
from kivy.uix.button import Button
from kivy.properties import *
class EmotionsScreen(Screen):
    def button_press(self, emotion_str):
        print (self.ids[emotion_str].emotion)
class ScreenManagement(ScreenManager):
    pass
class HappyButton(ButtonBehavior, Image):
    def on_press(self):
        print(self.emotion)
class SadButton(ButtonBehavior, Image):
    def on_press(self):
        print(self.emotion)
class TiredButton(ButtonBehavior, Image):
    def on_press(self):
        print(self.emotion)
class MyApp(App):
    def build(self):
        sm = ScreenManagement()
        sm.current = 'Emotions'
        return sm
if __name__=='__main__':
    MyApp().run()

以下是myapp.kv文件的内容: : 情绪屏幕:

<EmotionsScreen>:
    name:'Emotions'
    HappyButton:
        id: happy
        source: "happy.png"
        pos: (-200, 100)
        emotion: "Happy"
    SadButton:
        id: sad
        source: "sad.png"
        pos: (0, 100)
        emotion: "Sad"
    TiredButton:
        id: tired
        source: "tired.png"
        pos: (200, 100)
        emotion: "Tired"

运行应用程序并单击三个按钮后,我得到以下行为:

  • 单击快乐按钮会打印"悲伤":)
  • 单击悲伤按钮打印"累了">
  • 单击疲惫按钮可打印"疲倦">

即使我调用单个回调(在应用程序内部,提供参数(,也会发生上述情况,如下所示:

main.py:

from kivy.app import App
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.screenmanager import (ScreenManager, Screen)
from kivy.uix.button import Button
from kivy.properties import *
class EmotionsScreen(Screen):
    pass
class ScreenManagement(ScreenManager):
    pass
class ImageButton(ButtonBehavior, Image):
    pass
class MyApp(App):
    def build(self):
        sm = ScreenManagement()
        sm.current = 'Emotions'
        return sm
    def button_press(self, *args):
        print (args)

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

myapp.kv:

<ScreenManagement>:
    EmotionsScreen:
<EmotionsScreen>:
    name:'Emotions'
    ImageButton:
        source: "happy.png"
        pos: (-200, 100)
        on_press: app.button_press("Happy")
    ImageButton:
        source: "sad.png"
        pos: (0, 100)
        on_press: app.button_press("Sad")
    ImageButton:
        source: "tired.png"
        pos: (200, 100)
        on_press: app.button_press("Tired")

我希望它分别在单击三个按钮后打印"快乐","悲伤"和"疲倦"。我可以知道我哪里出错了吗?

这些图像似乎是随机放置的。使用按钮作为模型的示例:

from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.screenmanager import (ScreenManager, Screen)
from kivy.uix.button import Button
from kivy.properties import *
from kivy.lang import Builder
Builder.load_string('''
<EmotionsScreen>:
    name:'Emotions'
    HappyButton:
        id: happy
        pos: (-200, 100)
        text: "Happy"
        emotion: "Happy"
    SadButton:
        id: sad
        pos: (0, 100)
        text: "Sad"
        emotion: "Sad"
    TiredButton:
        id: tired
        pos: (200, 100)
        text: "Tired"
        emotion: "Tired"
''')
class EmotionsScreen(Screen):
    def button_press(self, emotion_str):
        print (self.ids[emotion_str].emotion)
class ScreenManagement(ScreenManager):
    pass
class HappyButton(Button):
    def on_press(self):
        print(self.emotion)
class SadButton(Button):
    def on_press(self):
        print(self.emotion)
class TiredButton(Button):
    def on_press(self):
        print(self.emotion)
class MyApp(App):
    def build(self):
        sm = ScreenManagement()
        sm.add_widget(EmotionsScreen())
        sm.current = 'Emotions'
        return sm
if __name__=='__main__':
    MyApp().run()

您应该在屏幕中放置一个布局来管理其小部件:

Builder.load_string('''
<EmotionsScreen>:
    name:'Emotions'
    BoxLayout:
        HappyButton:
            id: happy
            text: "Happy"
            emotion: "Happy"
        SadButton:
            id: sad
            text: "Sad"
            emotion: "Sad"
        TiredButton:
            id: tired
            text: "Tired"
            emotion: "Tired"
''')

最新更新