我认为有一种方法可以在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);
-----------
----------
}
是圆形图标。我将不胜感激推荐的最后一件事,如何将此按钮设置为特定大小是窗口?
答案 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 collisions。 Example
然而,即使对于单个按钮,这可能确实很昂贵,因此更好的解决方案是使用这样的东西: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