2014-11-08 50 views
1

我想在屏幕中间构建一个小部件。我没有使用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,为什么它是在窗口右上角的中心?

+0

因为size_hint和pos_hint将属性绑定到窗口小部件。然后,我不能通过简单地增加或减少它的x和y值来改变小部件的位置。通过上面的代码,将“self.x + = 1”添加到更新画布函数中,该小部件将移动。如果我用pos_hint定义了那个,那么小部件的位置会将每一帧重新设置回原来的位置。 – 2014-11-08 20:36:47

+0

你确定floatlayout自动填充整个窗口大小吗?如果不是这样,它可能会解释为什么雪碧不会做你想做的事。也许尝试首先将RootWidget的大小设置为它的父级大小(可能是window.size),然后设置Sprites大小和中心可能工作。 – Totem 2014-11-08 21:15:47

+0

是RootWidget是在MyApp的构建函数中返回时定义的根构件。它会自动形成窗口并在窗口更改大小时重新调整大小。我向RootWidget添加了一个函数来打印它的大小以及窗口的大小,它们是相同的。 – 2014-11-08 21:38:53

回答

3

大小提示默认为一个值,除非您明确定义它,并且它优先于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 =(..)),而不是中心。

+0

但如果我使用“center =(Window.width * 0.5,Window.height * 0.5)”,则中心位置不居中。我测量了从小部件顶部到窗口顶部和小部件底部到窗口底部的距离,我正在读取不同的测量值。也与窗口的左侧和右侧相关的小部件的左侧和右侧也不相等。 – 2014-11-08 20:43:53

+0

你是对的。我没有注意到抵消。我更新了我的回答 – tiktok 2014-11-08 21:38:06

+0

谢谢。我将中心更改为“pos =(Window.width * 0.5-Window.width * 0.05,Window.height * 0.5-Window.height * 0.05)”,并打印了窗口小部件中心和Window中心,现在它们是相同的。 – 2014-11-08 22:06:59