Kivy--图像按钮

Mel*_*des 4 kivy

我只是kivy和面向对象编程的初学者.

我一直在练习这段代码作为这里教程的组合:

from kivy.uix.behaviors import ButtonBehavior  
from kivy.uix.image import Image  
from kivy.lang import Builder  
from kivy.app import App  
from kivy.uix.floatlayout import FloatLayout  

Builder.load_string("""  
<ImageButton>:  
    FloatLayout:  
        Image:  
            source:'resizedA.png'  
            size_hint: .2, .2  
""")  

class ImageButton(ButtonBehavior,FloatLayout, Image):  
    def on_press(self):  
        print ('pressed')


class The_AssignmentApp(App):  
    def build(self):  
        return ImageButton()  

if __name__ == "__main__":  
    The_AssignmentApp().run()  
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么即使我按下屏幕的其他部分(不是图像),应用程序仍然将整个屏幕视为按钮?

请原谅我的无知,我真的很想学习.谢谢!

inc*_*ent 6

class ImageButton(ButtonBehavior,FloatLayout, Image):  
Run Code Online (Sandbox Code Playgroud)

不要从多个小部件继承(在本例中为FloatLayout和Image),这会导致一些奇怪的错误.

至于您的具体问题,ButtonBehavior是ImageButton的父类,它是根小部件并填充屏幕.出于这个原因,整个屏幕一个按钮,但你明确表示不同意.

以下更像是你想要的吗?您也可以使用FloatLayout而不是创建新的RootWidget类,我只是这样做以适应您已经编写的内容.

from kivy.uix.behaviors import ButtonBehavior  
from kivy.uix.image import Image  
from kivy.lang import Builder  
from kivy.app import App  
from kivy.uix.floatlayout import FloatLayout  

class RootWidget(FloatLayout):
    pass

class ImageButton(ButtonBehavior, Image):  
    def on_press(self):  
        print ('pressed')

Builder.load_string("""  
<RootWidget>:  
    ImageButton:  
        source:'resizedA.png'  
        size_hint: .2, .2  
""")  

class The_AssignmentApp(App):  
    def build(self):  
        return RootWidget()

if __name__ == "__main__":  
    The_AssignmentApp().run()  
Run Code Online (Sandbox Code Playgroud)

  • 我不明白如何使用它来触发任意函数,但是文档的这个页面 (https://kivy.org/doc/stable/api-kivy.uix.behaviors.html) 确实说明了这一点。你只需要添加一个类`ImageButton(ButtonBehavior, Image): pass`。然后您可以使用`ImageButton(source="PATH/TO/IMAGE", on_press=some_function())` 让图像充当按钮。 (2认同)