Kivy圆角(仅使用Python)
我有一个小Kivy应用程序(Python版本:3.7,Kivy版本:1.11.1): 代码#1Kivy圆角(仅使用Python),python,kivy,Python,Kivy,我有一个小Kivy应用程序(Python版本:3.7,Kivy版本:1.11.1): 代码#1 from kivy.app import App from kivy.lang import Builder from kivy.config import Config from kivy.uix.floatlayout import FloatLayout Config.set("graphics", "width", "500") Config.set("graphics", "height"
from kivy.app import App
from kivy.lang import Builder
from kivy.config import Config
from kivy.uix.floatlayout import FloatLayout
Config.set("graphics", "width", "500")
Config.set("graphics", "height", "300")
kv = """
<RoundedCornerLayout@FloatLayout>:
background_color: 0,0,0,0
canvas.before:
Color:
rgba: (.4,.4,.4,1)
RoundedRectangle:
pos: self.pos
size: self.size
radius: [(40, 40), (40, 40), (20, 20), (20, 20)]
"""
Builder.load_string(kv)
class RoundedCornerLayout(FloatLayout):
def __init__(self):
super().__init__()
self.size_hint = (None, None)
self.size = (400, 200)
self.pos_hint = {"center_x": 0.5, "center_y": 0.5}
class MainApp(App):
def build(self):
return RoundedCornerLayout()
if __name__ == "__main__":
MainApp().run()
很公平,我想
但后来我得到了这个结果:
据我所知,这两个指令(代码1和代码2)的表述方式相同,但方式不同。经科学证明,情况并非如此
…所以我想理解的是,我的问题的重点是:代码1和代码2之间的功能区别是什么?为什么它们显示不同的结果?将代码#1“翻译”为纯Python代码的正确方法是什么
忽略这样一个事实:只保留kivy代码是最简单的解决方案。我在这里需要的是理解这种行为,解释我的理由会不必要地扩大这个问题,让我们说你只能控制你所理解的。你有两个错误:
- 该项不是矩形,而是圆角矩形
- 在.kv中,如果绘制中使用的属性因绑定而更改,则画布将重新绘制,但是在Python中,必须显式地进行绑定
从kivy.app导入应用
从kivy.config导入配置
从kivy.graphics导入颜色,RoundedRectangle
从kivy.uix.floatlayout导入floatlayout
配置集(“图形”、“宽度”、“500”)
配置集(“图形”、“高度”、“300”)
类圆形角落布局(浮动布局):
定义初始化(自):
super()。\uuuu init\uuuuu()
使用self.canvas.before:
颜色(0.4,0.4,0.4,1)
self.rect=圆角矩形(
pos=self.pos,
大小=自身大小,
半径=[(40,40),(40,40),(20,20),(20,20)],
)
self.bind(pos=lambda obj,pos:setattr(self.rect,“pos”,pos))
self.bind(size=lambda obj,size:setattr(self.rect,“size”,size))
self.size\u hint=(无,无)
self.size=(400200)
self.pos_hint={“center_x”:0.5,“center_y”:0.5}
self.background_color=0,0,0,1
类主应用程序(应用程序):
def生成(自):
返回圆角布局()
如果名称=“\uuuuu main\uuuuuuuu”:
MainApp().run()
。你解决了我的疑问。非常感谢。
from kivy.app import App
from kivy.config import Config
from kivy.graphics import Color
from kivy.graphics import Rectangle
from kivy.uix.floatlayout import FloatLayout
Config.set("graphics", "width", "500")
Config.set("graphics", "height", "300")
class RoundedCornerLayout(FloatLayout):
def __init__(self):
super().__init__()
self.size_hint = (None, None)
self.size = (400, 200)
self.pos_hint = {"center_x": 0.5, "center_y": 0.5}
self.background_color = (0, 0, 0, 0)
self.canvas.before.add(Color(.4, .4, .4, 1))
self.canvas.before.add(Rectangle(
pos=self.pos,
size=self.size,
radius=[(40, 40), (40, 40), (20, 20), (20, 20)]))
class MainApp(App):
def build(self):
return RoundedCornerLayout()
if __name__ == "__main__":
MainApp().run()