我对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 ----->
谢谢!
答案 0 :(得分:2)
1)不要使用全局变量。这应该在技术上有效,但这是不好的做法,在这种情况下,简单地向你的班级添加变量没有任何缺点。 NotNone在这个时刻发布了一个如何使用kivy属性的示例,这会添加一些您可能会在以后找到方便的其他行为。
2)你的移动功能与像kivy(或许多其他gui库)之类的eventloop驱动的gui不兼容。问题是while
函数是一个阻塞调用 - 在move
函数终止之前,所有kivy的正常任务都无法执行。检测和传播触摸是其中之一,因此永远不会调用on_touch_up
,touched_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的一些最好的功能,所以如果它们不熟悉,请看看它们。