我是kivy的新手,需要一些有关以下问题的帮助。我将数字/运算符作为小部件(标签)动态地添加到布局(FloatLayout)的随机位置。我的想法是,当我点击数字/运算符时,它将围绕数字/运算符绘制一个圆圈。我得到一些非常奇怪的行为。无论我点击哪个数字/运算符,选择圆圈仅围绕最后添加的标签绘制。然后,如果我按下屏幕上的一些随机点,那么另外一个数字/操作员会被圈起来
以下是我的代码的核心:
class SelectedObject(Label):
selected = BooleanProperty()
refresh = BooleanProperty()
def __init__(self, **kwargs):
super(SelectedObject, self).__init__(**kwargs)
self.center_x = randint(0, Window.width/2)
self.center_y = randint(0, Window.height/2)
self.bind( refresh = self.redraw )
def redraw(self, *args):
#print('Redraw for: ' + self)
self.canvas.after.clear()
if self.selected:
with self.canvas.after:
Line(circle=(self.center_x, self.center_y, 20))
self.canvas.ask_update()
def on_touch_down(self, touch):
print("touch@: " + str(touch))
if not self.collide_point(touch.x, touch.y):
return False
print("yip: " + self)
self.selected = not self.selected
self.refresh = not self.refresh # force a redraw
return True
class GameNumber(SelectedObject):
pass
class Operator(SelectedObject):
pass
class GameApp(App):
numberArr = ListProperty([])
operatorArr = ListProperty([])
def build(self):
f = FloatLayout()
#populate numberArr and operatorArr
self.buildLevel()
for number in self.numberArr:
numberItem = GameNumber(text = str(number))
f.add_widget(numberItem)
for operator in self.operatorArr:
f.add_widget(Operator(text = operator))
return f
答案 0 :(得分:0)
这里的问题是您没有为标签设置尺寸。因此,每个标签占用尽可能多的空间,最后一个标签位于顶部,它将获得圆圈。
您需要为每个GameNumber和Operator传递某种size_hint
和/或size
。例如,如果您希望每个标签为10 x 10,则可以执行以下操作:numberItem = GameNumber(text=str(number), size_hint=(None, None), size=(10, 10))
。您可以通过设置size_hint=(0.1, 0.1)
来设置相对于窗口大小的大小。
请记住,默认情况下size_hint
始终为(1,1),因此如果您希望小部件小于容器的空间,则需要将其更改为其他内容,并设置size_hint=(None, None)
你想自己设定一个固定的size
。
如果您想在屏幕上随机定位标签,请查看pos_hint
,这比直接使用窗口大小更方便。此外,请记住,如果您不小心,多个标签可能会相互叠加或在窗口的边界甚至在外面。
编辑:为了帮助您找到此类问题的来源(通常与布局问题相关),请查看Kivy Widget Area Display