How To Make Circular Button In Kivy Using Button Behavior?
Solution 1:
Try importing Image also:
Image+ButtonBehavior:
source: "round-icon.png"
Solution 2:
You need to make a custom rule(/class) that has the behavior and you need to include Image
as el3phanten stated, yet it won't work only that way, because it'll return you a missing class.
Kv language creates a widget from either already registered classes, or custom classes, which may be Python + Kv (that thing you define in both files), or kv only(dynamic). I guess your intention is the dynamic one, so I'll go this way:
from kivy.app import App
from kivy.lang import Builder
kv = """
<Test@ButtonBehavior+Image>:
canvas:
Color:
rgba: 1, 0, 0, .3
Rectangle:
size: self.size
pos: self.pos
BoxLayout:
Button:
Test:
source: 'image.png'
"""classTestApp(App):
defbuild(self):
return Builder.load_string(kv)
if __name__ == '__main__':
TestApp().run()
The behavior needs to be first similar to inheriting in Python, then you may add another parts, such as Image
.
There's however a big problem for you in this implementation, which is visible with the Rectangle
in my example. That is an area that captures every touch, which means you might have a circular image, yet the touch are is still a rectangle.
To get around that you'll need to check for a collision, thus you need to switch from dynamic class to the one that's defined even in Python, so that you can make custom collisions. Example.
That, however, might be really costly even for a single button, therefore a better solution is using something like this:
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
kv = """
<RoundButton>:
canvas:
Color:
rgba: 1, 0, 0, .3
Rectangle:
size: self.size
pos: self.pos
Color:
rgba: 0, 0, 1, 1
Rectangle:
size:
[self.size[0] - root.OFFSET_x,
self.size[1] - root.OFFSET_y]
pos:
[self.pos[0] + root.OFFSET_x / 2.0,
self.pos[1] + root.OFFSET_y / 2.0]
BoxLayout:
Button:
RoundButton:
source: 'image.png'
on_release: print('Release event!')
"""classRoundButton(ButtonBehavior, Image):
OFFSET_x = NumericProperty(100)
OFFSET_y = NumericProperty(200)
defon_touch_down(self, touch):
left = touch.x >= self.pos[0] + self.OFFSET_x / 2.0
down = touch.y >= self.pos[1] + self.OFFSET_y / 2.0
up = touch.y <= self.pos[1] + self.size[1] - self.OFFSET_y / 2.0
right = touch.x <= self.pos[0] + self.size[0] - self.OFFSET_x / 2.0if left and down and up and right:
print('collided!')
self.dispatch('on_release')
else:
print('outside of area!')
classTestApp(App):
defbuild(self):
return Builder.load_string(kv)
if __name__ == '__main__':
TestApp().run()
or a really low number of points to a better area coverage, yet higher than for a simple rectangle.
How to set this button to certain size is the window?
Use size_hint
or directly Window.size
to manipulate your widget's size. size_hint
is definitely better unless you want to have everything in Window, i.e. without any proper Layout
Post a Comment for "How To Make Circular Button In Kivy Using Button Behavior?"