Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 触地时进入回路,触地时退出回路_Android_Python_Kivy - Fatal编程技术网

Android 触地时进入回路,触地时退出回路

Android 触地时进入回路,触地时退出回路,android,python,kivy,Android,Python,Kivy,我对Kivy&Python很陌生,所以请原谅我的代码/解释太差了 当触碰事件被激活时,我希望一段代码持续运行,直到触碰事件被激活 我当前的方法是使用一个全局变量,它由两个事件操作。但是循环似乎没有记录全局变量的变化 无论如何,有没有办法使这种方法奏效。或者另一种更合适的方法 touched_down = 1 def on_touch_down(self, touch): global touched_down touched_down = 1 self.mov

我对Kivy&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 ----->
触地=1
def on_触控向下(自身,触控):
全球着陆
触地=1
self.move()
def on_touch_up(自我,触摸):
全球着陆
触地=0
def移动(自我):
而(触地==1):

谢谢

我认为使用自定义属性可以解决您的问题。我无法测试这一点,但类似的东西应该可以工作

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 ----->
class MyWidget(小部件):
触地=数值属性(0)
def on_触控向下(自身,触控):
自着陆=1
self.move()
def on_touch_up(自我,触摸):
self.touched_down=0
def移动(自我):
当self.u着陆时:
在我看来,属性是Kivy最好的功能之一,如果不熟悉,请查看它们。

1)不要使用全局变量。从技术上讲,这应该是可行的,但这是一种糟糕的做法,在这种情况下,简单地向类中添加一个变量并没有坏处。NotNone在这一刻发布了一个关于如何使用kivy房产的示例,它添加了一些其他行为,您稍后可能会觉得方便

2) 您的移动功能与诸如kivy(或许多其他gui库)之类的eventloop驱动的gui不兼容。问题在于
while
功能是一个阻塞调用-在
move
功能终止之前,kivy的所有正常任务都无法执行。检测和传播触摸就是其中之一,因此永远不会调用触摸上的
on\u touch\u up
,触摸下的
touch\u 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 eventloop中,因此它被称为每一帧,而不会阻塞其他所有帧


如果有一个总是计划好的
update
功能(也可以做其他事情),并使用上面的
self.toucted
属性,可以选择在该功能期间执行移动,这可能会更自然。

使用整体更新功能效果很好!谢谢我尝试过使用它,但无法让它工作,我想是因为while循环阻止了事件的调用?(见严酷的回答)啊,当然可以。当然,while循环会阻止Kivy执行循环以外的任何操作,所以您需要使用时钟。我的坏和坏的答案是要走的路。但房地产仍然令人敬畏:)