Kivy圆角(仅使用Python)

Kivy圆角(仅使用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"

我有一个小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", "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()