我想创建一些动态磁贴布局,其中小部件的大小可调(例如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:)
答案 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)