在Kivy中创建动态磁贴布局

时间:2014-01-22 14:23:57

标签: layout dynamic tile kivy resizable

我想创建一些动态磁贴布局,其中小部件的大小可调(例如Appy Geek,就像Flipboard,但可调整大小的磁贴)。

我一直在使用this class,这有点脏(使用所有的Clock.Schedule_once,但我无法使其工作)。

我的问题是我不能让这个类动态地工作。例如,使用简单的main.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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


class MainApp(App):
    def add(self, gd, x, y, w, h):
        print gd, x.text, y.text, w.text, h.text
        x = int(x.text)
        y = int(y.text)
        w = int(w.text)
        h = int(h.text)
        gd.set_widget(Button(text='B %i %i' % (x, y)), x, y, w, h)
        gd.do_layout()

MainApp().run()

和一个简单的.kv:

#:kivy 1.8.0
#:import SGridLayout SGridLayout
#:import SGridLayoutCell SGridLayout

BoxLayout:
    orientation: 'vertical'
    SGridLayout:
        cols: 5
        rows: 4
        id: gd
    BoxLayout:
        orientation: 'horizontal'
        size_hint_y: None
        height: '50dp'
        TextInput:
            text: '1'
            id: x
        TextInput:
            text: '1'
            id: y
        TextInput:
            text: '1'
            id: w
        TextInput:
            text: '1'
            id: h
        Button:
            text: 'Add'
            on_press: app.add(gd, x, y, w, h)
        Button:
            text: 'Remove'

添加按钮时,它会显示在左下角,即使我们选择了另一个带输入的pos。但是一旦我们调整窗口大小,按钮就会转到真正的位置。

示例:在pos(1,1)处添加1x1按钮,然后稍微调整窗口大小(Imgur album

所以...任何想法? TYA:)

1 个答案:

答案 0 :(得分:0)

好的,我查看了你的代码并注意到widget的pos和size属性只在更新其各自单元格的属性时才会更新。我修改了SGridLayoutCell的add_widget方法,如下所示,使其工作:

def add_widget(self, widget, row=0, col=0, width=1, height=1):
    self.swidth = width
    self.sheight = height
    self.row = row
    self.col = col
    self.widget = widget

    # They are updated now!
    widget.pos = self.pos
    widget.size = self.size

    self.bind(pos=widget.setter('pos'))
    if self.swidth == 1:
        self.bind(width=widget.setter('width'))
    else:
        widget.width = self.width * self.swidth
    if self.sheight == 1:
        self.bind(height=widget.setter('height'))
    else:
        widget.height = self.height * self.sheight
    Clock.schedule_once(self.post_init)