如何在kivy中设置网格布局的位置(x,y坐标)?

问题描述:

我注意到,当您使用Kivy中的网格布局制作按钮时,它们将在(0,0)处创建并根据前一个按钮的长度和宽度移动多个空格。 但是,我想在屏幕底部的中间有一个3x4的网格。如何在kivy中设置网格布局的位置(x,y坐标)?

我有这个至今:

import kivy 
from kivy.uix.gridlayout import GridLayout 
from kivy.app import App 
from kivy.uix.button import Button 

class CalcApp(App): 
    def build(self): 
     layout = GridLayout(cols=3, row_force_default=True, row_default_height=50) 
     layout.add_widget(Button(text='1', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='2', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='3', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='4', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='5', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='2', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='6', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='7', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='8', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='9', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='0', size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='Enter', size_hint_x=None, width=100)) 
     return layout 

CalcApp().run() 

所以,我怎么转移的位置?

+0

我宁愿使用kvlang而不是使用这么多add_widget的。当有人看到这个代码时,它看起来很奇怪。 – 2014-05-04 11:07:00

import kivy 
from kivy.uix.gridlayout import GridLayout 
from kivy.app import App 
from kivy.uix.button import Button 

class CalcApp(App): 
    def build(self): 
     layout = GridLayout(cols=3, row_force_default=True, row_default_height=50, 
      pos_hint={'center_x':.5} , size_hint=(None, None)) 
      #^position grid in mid horizontally,^make grid use custom 
      # size. 
     # Bind the size of the gridlayout of to it's minimum_size(calculated 
     # by children size) 
     layout.bind(minimum_size = layout.setter('size')) 
     # bind the top of the grid to it's height' 
     layout.bind(height = layout.setter('top')) 
     for x in (1, 2, 3, 4, 5, 2, 6, 7, 8, 9, 0): 
      layout.add_widget(Button(text=str(x), size_hint_x=None, width=100)) 
     layout.add_widget(Button(text='Enter', size_hint_x=None, width=100)) 
     return layout 

CalcApp().run() 

使用KV郎相同的代码::

import kivy 

from kivy.uix.gridlayout import GridLayout 
from kivy.app import App 
from kivy.lang import Builder 

Builder.load_string(''' 
# a template Butt of type Button 
[[email protected]] 
    # ctx.'attribute_name' is used to access the 
    # attributes defined in the instance of Butt. 
    text: ctx.text 
    # below vars are constant for every instance of Butt 
    size_hint_x: None 
    width: 100 

<CalcApp>: 
    cols: 3 
    row_force_default: True 
    row_default_height: 50 
    pos_hint: {'center_x':.5} 
    size_hint: (None, None) 
    # size is updated whenever minimum_size is. 
    size: self.minimum_size 
    # top is updated whenever height is. 
    top: self.height 
    Butt: 
     text: '1' 
    Butt: 
     text: '2' 
    Butt: 
     text: '3' 
    Butt: 
     text: '4' 
    Butt: 
     text: '5' 
    Butt: 
     text: '2' 
    Butt: 
     text: '6' 
    Butt: 
     text: '7' 
    Butt: 
     text: '8' 
    Butt: 
     text: '9' 
    Butt: 
     text: '0' 
    Butt: 
     text: 'Enter' 
''') 

class CalcApp(App, GridLayout): 

    def build(self): 
     return self 

CalcApp().run() 
+0

谢谢,完美的工作。我想补充一点,从某种意义上说,你是一个“英雄”,因为我认为这个问题已经死了。此外,感谢您也添加kv代码。这是我第一次接触到,并且我计划在Kivy广泛使用计划的基础上研究Kivy语言。 – Stumbleine75 2012-08-15 06:52:22

+0

使用kvlang的+1 – 2014-05-04 11:05:55