触摸时进入循环,触摸时退出循环

时间:2014-05-10 05:14:06

标签: android python kivy

我对Kivy& amp; Python所以请原谅可怜的代码/解释!

当触摸事件被激活时,我想要一段代码连续运行,直到触摸事件被激活。

我当前的方法是使用由两个事件操纵的全局变量。但是这个循环似乎并没有记录全局变量的变化。

无论如何都要使这个方法有效。或者另一种更合适的方法呢?

    touched_down = 1

def on_touch_down(self, touch):
    global touched_down 
    touched_down = 1
    self.move()

def on_touch_up(self, touch):
    global touched_down 
    touched_down = 0

def move(self):
    while (touched_down == 1):
        <----- code ----->

谢谢!

2 个答案:

答案 0 :(得分:2)

1)不要使用全局变量。这应该在技术上有效,但这是不好的做法,在这种情况下,简单地向你的班级添加变量没有任何缺点。 NotNone在这个时刻发布了一个如何使用kivy属性的示例,这会添加一些您可能会在以后找到方便的其他行为。

2)你的移动功能与像kivy(或许多其他gui库)之类的eventloop驱动的gui不兼容。问题是while函数是一个阻塞调用 - 在move函数终止之前,所有kivy的正常任务都无法执行。检测和传播触摸是其中之一,因此永远不会调用on_touch_uptouched_down变量永远不会变为False。

你可能想要做类似的事情:

from kivy.clock import Clock

def on_touch_down(self, touch):
    Clock.schedule_interval(self.incremental_move, 0)

def on_touch_up(self, touch):
    Clock.unschedule(self.incremental_move)

def incremental_move(self, dt):
    # write code for movement in the time dt here

使用这样的时钟将运动插入到正常的kivy事件循环中,因此每帧都调用它而不会阻塞其他所有内容。

拥有一个始终安排的update函数(也可以执行其他操作)也可能更自然,并使用上面的self.touched_down属性可选择在该函数期间执行移动。< / p>

答案 1 :(得分:0)

我认为使用自定义属性可以解决您的问题。我无法测试这个,但是这样的事情应该有用。

class MyWidget(Widget):
    touched_down = NumericProperty(0)

    def on_touch_down(self, touch):
        self.touched_down = 1
        self.move()

    def on_touch_up(self, touch): 
        self.touched_down = 0

    def move(self):
        while self.touched_down:
            <----- code ----->

在我看来,属性是Kivy的一些最好的功能,所以如果它们不熟悉,请看看它们。