kivy中动态创建的小部件的on_touch_down问题

时间:2014-05-04 06:05:50

标签: kivy

我是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

1 个答案:

答案 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