无法在Kivy中使用Clock Callback

时间:2012-10-08 17:59:55

标签: android python kivy

我正在使用漂亮的Kivy框架为Android编写游戏。 我正在尝试创建一个时钟回调来运行指定的一段代码(用于绘制),每秒60次。

出于某种原因,我在Kivy时钟事件中绘制的任何内容都不会被绘制到屏幕上。为了消除我能做的所有变量,我采用了以下示例代码:

import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse


class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 1, 0)
            d = 30.
            Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d))


class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()


if __name__ == '__main__':
    MyPaintApp().run()

这很好用 - 当我点击屏幕时,它会在那里放一个黄色圆圈。 但是,当我像这样修改它时:

import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
from kivy.clock import Clock


class MyPaintWidget(Widget):
    def update(self, t):
        with self.canvas:
            Color(1, 1, 0)
            d = 30.
            Ellipse(pos=(200 - d/2, 200 - d/2), size=(d, d))


class MyPaintApp(App):
    def build(self):
        m = MyPaintWidget()
        Clock.schedule_interval(m.update, 1.)
        return m


if __name__ == '__main__':
    MyPaintApp().run()

屏幕上没有任何内容。为什么? 编辑:我发现它只在我点击它时画到屏幕上。仍然没用 - 我需要将它用于游戏的事件循环! 我正在使用Kivy 1.4.0(最新的第二个)和Ubuntu。这也无法在Android上正常工作。

1 个答案:

答案 0 :(得分:1)

我可以运行你的代码 - 我做了一些改变,所以你可以看到它确实每秒被调用。它现在打印出D的值,它每秒都会变化,并且大黄色圆圈每秒都会增长。我希望这会对你有所帮助。

import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
from kivy.clock import Clock

class MyPaintWidget(Widget):
    d = 10
    def update(self, t):
        print("D is", self.d)
        with self.canvas:
            Color(1, 1, 0)
            self.d = self.d + 1
            Ellipse(pos=(200 - self.d/2, 200 - self.d/2), size=(self.d, self.d))


class MyPaintApp(App):
    def build(self):
        m = MyPaintWidget()
        Clock.schedule_interval(m.update, 1.)
        return m


if __name__ == '__main__':
    MyPaintApp().run()