Python 为什么Kivy只为最后一个按钮在画布上绘制三角形?

Python 为什么Kivy只为最后一个按钮在画布上绘制三角形?,python,canvas,kivy,Python,Canvas,Kivy,我在Ubuntu上用python 3.8.3运行Kivy 2.0.0rc3。我试图在多个按钮上画一个三角形。三角形将仅显示在添加到布局的最后一个按钮上。我曾尝试使用kvlang和python代码在画布上绘图,两者都产生了相同的结果。我已经把代码贴在下面了 如何让Kivy在添加到布局的每个按钮上绘制三角形?先谢谢你 from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import B

我在Ubuntu上用python 3.8.3运行Kivy 2.0.0rc3。我试图在多个按钮上画一个三角形。三角形将仅显示在添加到布局的最后一个按钮上。我曾尝试使用kvlang和python代码在画布上绘图,两者都产生了相同的结果。我已经把代码贴在下面了

如何让Kivy在添加到布局的每个按钮上绘制三角形?先谢谢你

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Color, Triangle
from kivy.lang import Builder


KV = """
<TriangleButton>:
    canvas:
        Color:
            rgba: (1, 0, 0, 1)
        Triangle:
            points: [self.width / 3, self.height / 3, 2 / 3 * self.width, self.height / 3, self.width / 2, 2 / 3 * self.height]
"""

Builder.load_string(KV)


class TriangleButton(Button):
    pass
    
    # I have also tried the method below 
    # which yields the same results
    # def __init__(self, **kwargs):
    #     super().__init__(**kwargs)
    #     self.bind(pos=self.update_canvas)
    #     self.bind(size=self.update_canvas)
    #     self.update_canvas()
    #
    # def update_canvas(self, *args):
    #     self.canvas.after.clear()
    #     with self.canvas.after:
    #         Color(1, 0, 0)
    #         Triangle(points=[
    #             self.width / 3, self.height / 3,
    #             2 / 3 * self.width, self.height / 3,
    #             self.width / 2, 2 / 3 * self.height
    #         ])


class MyApp(App):
    def build(self):
        w = BoxLayout(orientation='vertical')
        w.add_widget(TriangleButton())
        w.add_widget(TriangleButton())
        return w


if __name__ == '__main__':
    app = MyApp()
    app.run()

从kivy.app导入应用
从kivy.uix.button导入按钮
从kivy.uix.boxlayout导入boxlayout
从kivy.graphics导入颜色、三角形
从kivy.lang导入生成器
KV=”“”
:
画布:
颜色:
rgba:(1,0,0,1)
三角形:
点数:[self.width/3,self.height/3,2/3*self.width,self.height/3,self.width/2,2/3*self.height]
"""
建筑商荷载(千伏)
类三角形按钮(按钮):
通过
#我也尝试过下面的方法
#这会产生相同的结果
#定义初始(自我,**kwargs):
#超级()
#self.bind(pos=self.update\u画布)
#self.bind(大小=self.update\u画布)
#self.update_canvas()
#
#def更新画布(自身,*参数):
#self.canvas.after.clear()
#使用self.canvas.after:
#颜色(1,0,0)
#三角形(点)=[
#自宽/3,自高/3,
#2/3*自宽、自高/3,
#自宽/2,2/3*自高
#         ])
类别MyApp(应用程序):
def生成(自):
w=框布局(方向=垂直)
w、 添加小部件(三角形按钮())
w、 添加小部件(三角形按钮())
返回w
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=MyApp()
app.run()
这是Kivy日志信息

[INFO   ] [Logger      ] Record log in /home/michael/.kivy/logs/kivy_20-09-27_37.txt
[INFO   ] [Kivy        ] v2.0.0rc3, git-20c14b2, 20200615
[INFO   ] [Kivy        ] Installed at "/home/michael/anaconda3/lib/python3.8/site-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.8.3 (default, Jul  2 2020, 16:21:59) 
[GCC 7.3.0]
[INFO   ] [Python      ] Interpreter at "/home/michael/anaconda3/bin/python"
[INFO   ] [Factory     ] 185 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer, img_gif ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
[INFO   ] [GL          ] OpenGL version <b'3.0 Mesa 20.0.8'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel Open Source Technology Center'>
[INFO   ] [GL          ] OpenGL renderer <b'Mesa DRI Intel(R) HD Graphics 4000 (IVB GT2)'>
[INFO   ] [GL          ] OpenGL parsed version: 3, 0
[INFO   ] [GL          ] Shading version <b'1.30'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <16>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [ProbeSysfs  ] device match: /dev/input/event4
[INFO   ] [MTD         ] Read event from </dev/input/event4>
[INFO   ] [Base        ] Start application main loop
[WARNING] [MTD         ] Unable to open device "/dev/input/event4". Please ensure you have the appropriate permissions.
[INFO   ] [Base        ] Leaving application in progress...
[INFO][Logger]记录登录/home/michael/.kivy/logs/kivy_20-09-27_37.txt
[INFO][Kivy]v2.0.0rc3,git-20c14b2,20200615
[信息][Kivy]安装在“/home/michael/anaconda3/lib/python3.8/site-packages/Kivy/_-init__;.py”
[INFO][Python]v3.8.3(默认值,2020年7月2日,16:21:59)
[GCC 7.3.0]
[INFO][Python]解释器位于“/home/michael/anaconda3/bin/Python”
[信息][工厂]已加载185个符号
[信息][图像]提供商:img_-tex、img_-dds、img_-sdl2、img_-pil(img_-ffpyplayer、img_-gif忽略)
[信息][文本]提供商:sdl2
[信息][窗口]提供程序:sdl2
[信息][GL]使用“OpenGL”图形系统
[信息][GL]已使用后端
[信息][GL]OpenGL版本
[信息][GL]OpenGL供应商
[INFO][GL]OpenGL渲染器
[信息][GL]OpenGL解析版本:3,0
[信息][GL]明暗处理版本
[信息][GL]纹理最大大小
[信息][GL]纹理最大单位
[信息][窗口]自动添加sdl2输入提供程序
[信息][窗口]不允许使用虚拟键盘,单模,未对接
[INFO][ProbeSysfs]设备匹配:/dev/input/event4
[信息][MTD]从中读取事件
[INFO][Base]启动应用程序主循环
[警告][MTD]无法打开设备“/dev/input/event4”。请确保您具有适当的权限。
[INFO][Base]正在退出应用程序。。。
三角形点的声明没有考虑小部件的位置,因此所有三角形都绘制在同一位置,因为所有小部件都具有相同的宽度和高度,即使它们位于不同的位置


您需要包括pos变量,例如,前两个条目应该是
[self.x+self.width/3,self.y+self.height/3,…

我知道这将是一个简单的问题。感谢您快速清晰的回答!
points: [self.width / 3, self.height / 3, 2 / 3 * self.width, self.height / 3, self.width / 2, 2 / 3 * self.height]