2014-07-16 99 views
1

我裏面的BoxLayout這個佈局(連同其他元素):如何在Kivy中獲取小部件/佈局的實際大小?

<PlayField>: 
    size_hint_x: None 
    width: self.height 
    canvas.before: 
     Color: 
      rgb: .9, .9, .9 
     Rectangle: 
      pos: self.pos 
      size: self.size 

main.py:

class PlayField(Layout): # Or should it be Widget? 
    pass 

我如何得到它的實際尺寸是多少? print(self.size)顯示默認大小(100,100),雖然它不是真的。

回答

1

小部件的大小取決於您檢查的時間。在創建小部件但放置在佈局內部時不計算大小。例如:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.layout import Layout 

kv = ''' 
<Foo>: 
    on_touch_down: print(self.size) 
''' 
Builder.load_string(kv) 

class Foo(Layout): 
    def __init__(self, **kwargs): 
     super().__init__(**kwargs) 
     print (self.size) 

class MyApp(App): 
    def build(self): 
     return Foo() 

MyApp().run() 

裏面__init__()方法值的大小仍然是(100,100)。稍後點擊小部件後,它將返回適當的值。

如果你願意,你可以控件大小結合的方法,將調整後,被稱爲:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.layout import Layout 

class Foo(Layout): 
    def __init__(self, **kwargs): 
     super().__init__(**kwargs) 
     self.bind(pos=self.update) 
     self.bind(size=self.update) 
     self.update() 

    def update(self, *args): 
     print(self.size) 
     self.canvas.clear() 
     with self.canvas: 
      pass 

class MyApp(App): 
    def build(self): 
     return Foo() 

MyApp().run() 

首先,Foo與默認大小值創建。然後顯示它,因此適當的尺寸值被計算並分配給尺寸屬性,這觸發了update方法。任何其他尺寸的更新(例如,如果您重新調整窗口)也會觸發此方法。 Kivy language這是自動執行此操作並且它是推薦的方法。

最後,我不知道你想達到什麼目的,但我懷疑你並不是真的需要這個值。

+0

如果我需要構造函數中的實際大小,該怎麼辦?例如。裏面'與self.canvas:'? – Necronomicron

+1

@Necronomicron,答案已更新。 – Nykakin

相關問題