怎么做?从画布中获取id.修复画布错位,在kivy与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:canvas1main.py", line 16, in minimizer
print(canvas.ids.rect.size)
File "kivyproperties.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自动发生的(至少从开发人员的角度)。这就是为什么在设计中使用这种语言很方便的原因。来自kivy doc.,

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

现在在kvlang中,当你这样做时:

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

在canvas指令中,你基本上是在指示在窗口中画一个矩形(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

最新更新