2017-07-19 105 views
1

我对Python和Kivy很少有经验。我正在帮助我的小侄子追求使用这两款游戏来制作游戏。我们被困在看起来很简单的事情上。Python Kivy浮点布局

考虑下面的代码:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.properties import NumericProperty, ReferenceListProperty,\ 
    ObjectProperty 
from kivy.vector import Vector 
from kivy.clock import Clock 
from random import randint 
from kivy.graphics import Color, Ellipse, Rectangle 
from kivy.uix.floatlayout import FloatLayout 
import math 

class Fly(Widget): 
    pass 

class Stick(Widget): 
    pass 

class FlyBox(Widget): 
    pass 

class GameArea(FloatLayout): 
    pass 

class FlyApp(App): 
    def build(self): 
     gameArea = GameArea() 
     flyBox = FlyBox() 
     flyBox.canvas.add(Rectangle(pos_hint={'x': 0, 'y': .3}, size_hint=(1, .3))) 
     flyBox.canvas.add(Color(1, 0, 0)) 
     gameArea.add_widget(flyBox) 
     return gameArea 


if __name__ == '__main__': 
    FlyApp().run() 

它产生以下输出:

enter image description here

我们试图实现是:

  • 的FlyBox的高度应为1/GameArea高度的3倍。
  • FlyBox的宽度应该与GameArea的宽度相同。
  • FlyBox的x坐标应为0,其y坐标应为GameArea高度的1/3。

即,如果游戏区域被分成3个相等大小的水平条带,FlyBox应该是中间条带。随着游戏区域的大小发生变化(由于窗口的大小调整),FlyBox的大小和位置应该相对变化。

我们正试图避免使用.kv文件,而是在Python中执行所有操作。

回答

0

您只需要使用size_hint_y属性来设置正确的身高(父母高度的1/3)和pos_hint属性以将其放置在中心位置。

使用kivy languaje:

from kivy.app import App 
from kivy.uix.floatlayout import FloatLayout 
from kivy.lang import Builder 

kv_text = ''' 
<GameArea>: 
    Widget: 
     id: flybox 
     size_hint_y: 1/3 
     pos_hint: {'x': 0, 'center_y': .5} 
     canvas.before: 
      Color: 
       rgba: 1,1,1,1 
      Rectangle: 
       pos: self.pos 
       size: self.size 
''' 

class GameArea(FloatLayout): 
    pass 

class FlyApp(App): 
    def build(self): 
     Builder.load_string(kv_text) 
     return GameArea() 

if __name__ == '__main__': 
    FlyApp().run() 

输出:

enter image description here