无法在 Kivy 中绘制时钟回调

Posted

技术标签:

【中文标题】无法在 Kivy 中绘制时钟回调【英文标题】:Can't draw in Clock Callback in Kivy 【发布时间】:2012-09-29 00:24:16 【问题描述】:

我正在使用漂亮的 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 上也无法正常工作。

【问题讨论】:

您使用的是最新版本的 kivy(最新版本还是 git)?我尝试了您的第二个脚本,它对我有用。另外,你用的是什么平台? 我在 Kivy 1.4.0、Windows、Python 2.7 上,第二个脚本允许我右键单击,然后它会在鼠标周围绘制一个圆圈,直到我释放按钮。我可以左键单击选择要移动的圆圈,或者只需单击并释放它们就会消失。 【参考方案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()

【讨论】:

以上是关于无法在 Kivy 中绘制时钟回调的主要内容,如果未能解决你的问题,请参考以下文章

Kivy - 在文本周围绘制矩形

用canvas绘制一个简易时钟

HTML canvas 绘制时钟

Canvas绘制时钟

canvas自适应圆形时钟绘制

OpenCV-Python实战(番外篇)——OpenCV中绘制模拟时钟显示当前时间