在kivy中为按钮创建圆角的首选方法是什么?
还有其他同样可行的方法来执行此任务吗?谢谢。
答案 0 :(得分:23)
这是一个棘手的问题。据我所知,Widgets
总是长方形。但我们可以分别使用background_normal
和background_down
属性更改背景并为正常和向下状态放置几个图像。您还需要了解border
属性。
通过这两个名为normal.png
和down.png
的图片,您可以开始添加圆形边框。
以下是一段非常简单的代码(我尝试解释下面的border
属性):
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.lang import Builder
Builder.load_string("""
<Base>:
Button:
background_normal: 'normal.png'
background_down: 'down.png'
border: 30,30,30,30
""")
class Base(FloatLayout):
pass
class ButtonsApp(App):
def build(self):
return Base()
if __name__ == "__main__":
ButtonsApp().run()
我理解这一点(我可能错了)是这样的。 border: 30,30,30,30
中的值表示顶部,右侧,底部和左侧的像素将用于背景按钮的边框。剩下的就是中间部分。我不确定。顺便说一句,如果你想看到一些很酷的东西,请参阅例如border: 150,150,150,150
。原因是我们正在拾取比实际图像更大的边界。
警告:小部件仍然是矩形。这意味着即使您单击圆角,该按钮仍会收到该事件。我想这是一个合理的价格。如果你想做更好的事情,也许我可以帮助你,但我们需要用一些数学来碰撞积分。文档中Pong Game tutorial的一个技巧是实际上球是一个正方形。我发布了相关问题here,但您需要使用Canvas
答案 1 :(得分:4)
如果你只是寻找漂亮的外表,并且对于角落并不挑剔,虽然是圆角的,仍然是接触点,你可以简单地做到,如这个示例程序所示(这有很大的半径)样品):
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.base import runTouchApp
kv="""
<RoundedButton@Button>:
background_color: 0,0,0,0 # the last zero is the critical on, make invisible
canvas.before:
Color:
rgba: (.4,.4,.4,1) if self.state=='normal' else (0,.7,.7,1) # visual feedback of press
RoundedRectangle:
pos: self.pos
size: self.size
radius: [50,]
"""
class RoundedButton(Button):
pass
Builder.load_string(kv)
runTouchApp(RoundedButton(text="Hit Me!"))
答案 2 :(得分:0)
一个带有画布物品的自制课程怎么样?
您可以更改每个布局的半径。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.graphics import *
root=Widget()
class RoundCorner(RelativeLayout):
def __init__(self,r=50,**kwargs):
super(RoundCorner, self).__init__(**kwargs)
self.surf=FloatLayout(); self.add_widget(self.surf)
with self.canvas:
Color(.3,0,3,0.3)
Rectangle(pos=[-r,0],size=[r,self.size[1]])
Rectangle(pos=[0,-r],size=[self.size[0],self.size[1]+2*r])
Rectangle(pos=[self.size[0],0],size=[r,self.size[1]])
Color(0,.3,0,.5)
Ellipse(pos=[-r,-r],size=[2*r,2*r])
Ellipse(pos=[self.size[0]-r,-r],size=[2*r,2*r])
Ellipse(pos=[-r,self.size[1]-r],size=[2*r,2*r])
Ellipse(pos=[self.size[0]-r,self.size[1]-r],size=[2*r,2*r])
Color(1,1,1,0.3)
self.bg=Rectangle(size=self.size)
root.add_widget(RoundCorner(size=[300,400],pos=[320,100]))
root.add_widget(RoundCorner(size=[100,100],pos=[100,200]))
class MyApp(App):
def __init__(self):
super(MyApp, self).__init__()
def build(self):
return root
if __name__=="__main__":
MyApp().run()
我选择了一个相对布局,因为写这个东西比较容易。可以通过将其全局位置添加到画布项目来将其应用于小部件,但为了简单起见,我这样做了。并像这样选择颜色以使逻辑可见。下面是上面代码的例子:
只需调整代码中的 Color
,即可开始使用。
这更好,因为分辨率不是问题(我可能错了 - 我不是 OpenGL 专家)。
嗯,这不是一个完整的按钮。它只是一个布局,只需触摸或按下,它就可以像真正的按钮一样使用。我没有在代码中包含它。有很多关于 the official site 事件的内容。