Przycisk to przycisk, obrazek to osobny widget, nawet jak sobie umieścisz dokładnie nad przyciskiem, to jedynie go sobie przysłonisz. Poprawne podejście polega na stworzeniu sobie własnego przycisku poprzez stworzenie podklasy ButtonBehavior
(widget Button
jest zaimplentowany jako klasa dziedzicząca po Label
i ButtonBehavior
), z wybranym layoutem. W najprostszym przypadku jest to po prostu podklasa widgetu Image
i ButtonBehavior
.
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.behaviors import ButtonBehavior
class MyButton(ButtonBehavior, Image):
def __init__(self, **kwargs):
super(MyButton, self).__init__(**kwargs)
self.source = 'off.jpeg'
def on_press(self):
self.source = 'on.jpeg'
def on_release(self):
self.source = 'off.jpeg'
class SampleApp(App):
def build(self):
return MyButton()
SampleApp().run()
off.jpeg
on.jpeg
Jak chcesz mieć przycisk składający się z obrazka i napisu, to tworzysz podklasę BoxLayout
i ButtonBehavior
i w layout wstawiasz obrazek i napis, jak wymagane, a w odpowiednich metodach stylizujesz (bądź nie) aby było widać, kiedy przycisk jest naciskany.
Prymitywny przykład
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.graphics import Color, Rectangle
class MyButton(ButtonBehavior, BoxLayout):
def __init__(self, **kwargs):
super(MyButton, self).__init__(**kwargs)
self.image = Image(source="off.jpeg")
self.label = Label(text="Click me...")
self.orientation = "horizontal"
self.add_widget(self.image)
self.add_widget(self.label)
def on_size(self, *args):
with self.canvas.before:
self.canvas.before.clear()
Color(1., 0, 0)
Rectangle(pos=self.pos, size=self.size)
def on_press(self):
self.image.source = 'on.jpeg'
self.label.text = "yay...!"
def on_release(self):
self.image.source = 'off.jpeg'
self.label.text = "Click me..."
class SampleApp(App):
def build(self):
layout = FloatLayout()
layout.add_widget(MyButton(size_hint=(0.2, 0.2), pos=(40, 200)))
return layout
SampleApp().run()