【问题标题】:Python Kivy - Issue moving canvas objectsPython Kivy - 发出移动画布对象
【发布时间】:2020-08-23 04:56:10
【问题描述】:

在尝试更新画布中的项目时运行不同方面后。对象拒绝在画布内移动,即使我有对对象本身的引用,我也无法设置它的位置。我在这里提供的代码部分似乎是唯一真正的问题。它通过 Screen 运行,获取一个小部件,该小部件包含一个画布和标签。我能够毫无问题地浏览标签,并且与画布对象相同。唯一的区别是我无法重新定位画布对象,但标签的问题为零。

是否有特殊的属性或方法来更新或更改画布对象的位置? 我尝试过使用 ask_update()、draw()、标记移动的对象等。我不确定它为什么不起作用。

         if type(obj).__name__ == DonateButton.__name__:
            cnv_items = [child for child in obj.canvas.children]
            for cnv_obj in cnv_items:
                if type(cnv_obj).__name__ in [Ellipse.__name__, RoundedRectangle.__name__]:
                    cnv_obj.pos = (0,0)

【问题讨论】:

    标签: python python-3.x canvas kivy kivy-language


    【解决方案1】:

    您可以使用canvasgroup 指令动态更改其对象的属性。下面是一个示例,显示了一个 canvas 下的 RectangleEllipse 对象,其中 pos 属性随随机生成的数字发生变化:

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.clock import Clock
    from kivy.uix.boxlayout import BoxLayout
    from kivy.core.window import Window
    import random
    
    APP_KV = """
    <CanvasTest>:
        canvas:
            Color:
                rgba: 0, 1, 0, 1
            Rectangle:
                group: 'rectangle'
                size: 400, 200
                pos: self.pos
            Color:
                rgba: 1, 0, 0, 1
            Ellipse:
                group: 'ellipse'
                size: 200, 100
                pos: self.pos
    """
    
    class CanvasTest(BoxLayout):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            Clock.schedule_interval(self.test_pos, 1)
            
        def test_pos(self, *args):
            self.canvas.get_group('rectangle')[0].pos = random.randrange(1, Window.width - 400), random.randrange(1, Window.height - 200)
            self.canvas.get_group('ellipse')[0].pos = random.randrange(1, Window.width - 200), random.randrange(1, Window.height - 100)
    
    class MainApp(App):
        def build(self):
            self.root = Builder.load_string(APP_KV)
            return CanvasTest()
    
    if __name__ == '__main__':
        MainApp().run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      相关资源
      最近更新 更多