如何使用按钮行为在kivy中制作圆形按钮?

时间:2016-12-31 07:05:54

标签: python kivy

我认为有一种方法可以在kivy中进行,而不是绕过python代码。

我在kv文件中的代码:

round-icon.png

应用程序崩溃说

  

AttributeError:'ButtonBehavior'对象没有属性   'register_event_type'

void heapSort(int arr[], int n){ // Build heap (rearrange array) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); ----------- ---------- } 是圆形图标。我将不胜感激推荐的最后一件事,如何将此按钮设置为特定大小是窗口?

2 个答案:

答案 0 :(得分:1)

尝试导入图像:

Image+ButtonBehavior:
     source: "round-icon.png"

答案 1 :(得分:0)

您需要创建一个具有该行为的自定义规则(/ class),并且您需要将Image作为el3phanten声明,但它不会仅以此方式工作,因为它会给你一个失踪的课程。

Kv语言从已经注册的类或自定义类创建一个小部件,可能是Python + Kv(您在两个文件中定义的那个),或仅限kv(动态)。我想你的意图是动态的,所以我会这样:

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'
"""

class TestApp(App):
    def build(self):
        return Builder.load_string(kv)

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

行为需要优先类似于在Python中继承,然后您可以添加其他部分,例如Image

但是在这个实现中有一个很大的问题,在我的示例中可以看到Rectangle。这是一个捕捉每一次触摸的区域,这意味着您可能有一个圆形图像,但触摸仍然是矩形

要解决这个问题,你需要检查是否存在冲突,因此你需要从动态类切换到即使在Python中定义的动态类,这样你就可以制作custom collisionsExample

然而,即使对于单个按钮,这可能确实很昂贵,因此更好的解决方案是使用这样的东西:

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!')
"""


class RoundButton(ButtonBehavior, Image):
    OFFSET_x = NumericProperty(100)
    OFFSET_y = NumericProperty(200)

    def on_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.0

        if left and down and up and right:
            print('collided!')
            self.dispatch('on_release')
        else:
            print('outside of area!')


class TestApp(App):
    def build(self):
        return Builder.load_string(kv)

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

或者指向更好的区域覆盖范围的点数非常少,但高于简单矩形。

  

如何将此按钮设置为特定大小的窗口?

使用size_hint或直接Window.size来操纵窗口小部件的大小。 size_hint肯定会更好,除非您想要在Window中拥有所有内容,即没有任何正确的Layout