繁体   English   中英

我怎样才能 1. 从画布中获取 id 2. 修复画布错位,在 kivy 中使用 python

[英]How can i 1. get an id from a canvas 2. fix the canvas misplacement , in kivy with python

  1. 我试图从名为 Canvas_Widget 类的画布中获取矩形的大小,但无论我做什么,它都会不断给出错误,我编写的代码和错误描述在代码中作为注释给出.

源文件:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.metrics import dp

Window.size= dp(500),dp(500)

class Canvas_Widget(Widget):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)

class MainWidget(BoxLayout):
    def __init__(self,**kwargs):
        super(MainWidget, self).__init__(**kwargs)

    def minimizer(self,button):
        button.background_color=(1,0,0,1)
        #here i  want to try and print the size of that rect id that i created
        # i tried "print(self.ids.Canvas.ids.rect.size)"
        """the error says: (((File "f:\canvas\1\main.py", line 16, in minimizer
            print(canvas.ids.rect.size)
            File "kivy\properties.pyx", line 964, in  kivy.properties.ObservableDict.__getattr__
            AttributeError: 'super' object has no attribute '__getattr__')))"""
    def minimizer_release(self,button):
        button.background_color=(.3,.3,1,1) 

class mynewApp(App):
    pass

mynewApp().run()

这是kivy文件:

MainWidget:


<Canvas_Widget>:
    canvas:
        Color: 
            rgb:.4,.4,.4,1
        Rectangle:
            id:rect     #this is the id that Im trying to share with the MainWidget
            pos:dp(100),dp(100)
            size:self.width - dp(200),self.height - dp(200)
        Color: 
            rgb:0,1,0,1
        Line:
            points:(dp(100),self.height - dp(100),self.width - dp(100),dp(100))
        Line:
            points:(dp(100),dp(100),self.width - dp(100),self.height - dp(100))

<MainWidget>:
    Button:
        text:'press'
        on_press:root.minimizer(self)
        background_color:(.3,.3,1,1)   
        on_release: root.minimizer_release(self) 
    Canvas_Widget:
        id:Canvas

这也是画布在屏幕上放置的问题。 它假设在右侧,但在左侧,在按钮上:图片 1

图 2

顺便说一句,我很抱歉要求太多。 只是我真的很想知道如何解决这个问题。 谢谢

首先要注意的是,在kvlang中绑定是由Builder自动发生的(至少从开发人员方面)。 这就是为什么将这种语言用于设计目的很方便。 来自基维文档。 ,

随着您的应用程序变得越来越复杂,小部件树的构造和绑定的显式声明变得冗长且难以维护是很常见的。 KV 语言是克服这些缺点的一种尝试。 KV 语言,有时称为 kvlang 或 kivy 语言,允许您以声明的方式创建小部件树,并将小部件属性彼此绑定或以自然方式绑定到回调。

现在在kvlang中,当您执行以下操作时:

Rectangle:
    pos:dp(100),dp(100)

在画布说明中,您基本上是在指示在窗口中的 (100, 100) 处绘制一个矩形。 但是你想要的(看起来)是绘制小部件所在的矩形,并从它的位置移动 (100, 100)。

现在,当您使用BoxLayout作为容器时,它的每个孩子的位置、大小都由自己管理(如果没有明确提供)。 因此,为了反映这些更改,您需要通过以下方式更改上述代码行,

Rectangle:
    pos: self.x+dp(100), self.y+dp(100)

每当小部件 (x, y) 的位置发生变化时,这将重新定位矩形(自动)。

因此,您在kvlang中需要的更改是,

<Canvas_Widget>:
    canvas:
        Color: 
            rgb:.4,.4,.4,1
        Rectangle:
#            id:rect # Will not work here.
#            pos:dp(100),dp(100)
            pos: self.x+dp(100), self.y+dp(100)
            size: self.width - dp(200), self.height - dp(200)
        Color: 
            rgb:0,1,0,1
        Line:
#            points:(dp(100),self.height - dp(100),self.width - dp(100),dp(100))
            points: (self.x+dp(100), self.y+self.height-dp(100), self.x+self.width-dp(100),self.y+dp(100))
        Line:
#            points:(dp(100),dp(100),self.width - dp(100),self.height - dp(100))
            points: (self.x+dp(100), self.y+dp(100),self.x+self.width-dp(100), self.y+self.height-dp(100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM