[英]How can i 1. get an id from a canvas 2. fix the canvas misplacement , in kivy with python
源文件:
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
顺便说一句,我很抱歉要求太多。 只是我真的很想知道如何解决这个问题。 谢谢
首先要注意的是,在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.