在基维中添加小部件
我想在屏幕中间构建一个小部件。我没有使用pos_hint或size_hint,因为稍后我会改变小部件的位置,但是当我构建小部件时,其大小和位置不正确。这里是我的代码:在基维中添加小部件
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.widget import Widget
from kivy.graphics import *
from kivy.clock import Clock
class Sprite(Widget):
def __init__(self, **kwargs):
super(Sprite, self).__init__(**kwargs)
Clock.schedule_interval(self.update_canvas, 1.0/60)
def update_canvas(self, dt):
with self.canvas:
Rectangle(size=self.size, pos=self.pos)
class RootWidget(FloatLayout):
def __init__(self, **kwargs):
super(RootWidget, self).__init__(**kwargs)
self.add_widget(Sprite(
size=(Window.width*0.1, Window.height*0.1),
center=(Window.width*0.5, Window.height*0.5)
))
class MyApp(App):
def build(self):
app = RootWidget()
return app
if __name__=="__main__":
MyApp().run()
为什么控件的大小不等于窗口大小的1/10,为什么它是在窗口右上角的中心?
大小提示默认为一个值,除非您明确定义它,并且它优先于size属性。您可能不想使用尺寸提示功能,但除非您禁用它,否则手动设置的尺寸将在默认情况下被覆盖。尝试添加下面的修改,结果有和没有size_hint线比较:
self.add_widget(Sprite(
size_hint=(None,None),
size=(Window.width*0.1, Window.height*0.1),
center=(Window.width*0.3, Window.height*0.5)
))
你可以看到实际的尺寸通过检查设定:python myscript.py -m inspector
,打控制+ E在kivy窗口
参考:http://kivy.org/docs/api-kivy.modules.inspector.html
中心是(x + width/.2,y + height/.2)的别名,但宽度和高度默认为100.在创建时,这些默认测量是用于反转计算以在您拨打电话时设置x和y,以便您的高度和宽度不同t从100开始,那么你会被差异所抵消。实例化时直接使用x和y(即pos =(..)),而不是中心。
但如果我使用“center =(Window.width * 0.5,Window.height * 0.5)”,则中心位置不居中。我测量了从小部件顶部到窗口顶部和小部件底部到窗口底部的距离,我正在读取不同的测量值。也与窗口的左侧和右侧相关的小部件的左侧和右侧也不相等。 – 2014-11-08 20:43:53
你是对的。我没有注意到抵消。我更新了我的回答 – tiktok 2014-11-08 21:38:06
谢谢。我将中心更改为“pos =(Window.width * 0.5-Window.width * 0.05,Window.height * 0.5-Window.height * 0.05)”,并打印了窗口小部件中心和Window中心,现在它们是相同的。 – 2014-11-08 22:06:59
因为size_hint和pos_hint将属性绑定到窗口小部件。然后,我不能通过简单地增加或减少它的x和y值来改变小部件的位置。通过上面的代码,将“self.x + = 1”添加到更新画布函数中,该小部件将移动。如果我用pos_hint定义了那个,那么小部件的位置会将每一帧重新设置回原来的位置。 – 2014-11-08 20:36:47
你确定floatlayout自动填充整个窗口大小吗?如果不是这样,它可能会解释为什么雪碧不会做你想做的事。也许尝试首先将RootWidget的大小设置为它的父级大小(可能是window.size),然后设置Sprites大小和中心可能工作。 – Totem 2014-11-08 21:15:47
是RootWidget是在MyApp的构建函数中返回时定义的根构件。它会自动形成窗口并在窗口更改大小时重新调整大小。我向RootWidget添加了一个函数来打印它的大小以及窗口的大小,它们是相同的。 – 2014-11-08 21:38:53