首页 > 解决方案 > 如何在kivy中每秒显示一个随机点

问题描述

我尝试在 kivy 中每秒显示一个随机点。这是我的代码。我知道如何显示点,在这种情况下是椭圆。但我不知道如何让它的位置每秒更新一次。

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.widget import Widget
from kivy.graphics import Ellipse
import time
import numpy as np

class RandomPoint(Widget):

def __init__(self,dimension):
    super(RandomPoint,self).__init__()
    self.d = dimension
    self.point = Ellipse(pos=list(np.random.randint(0,1000,2)),size = (self.d, self.d))

def update(self, *args):
    self.point = Ellipse(pos=list(np.random.randint(0,1000,2)),size = (self.d, self.d))

class TimeApp(App):
def build(self):
    wid = Widget()
    with wid.canvas:
        p = RandomPoint(25)
        Clock.schedule_interval(p.update, 1)
    return wid

TimeApp().run()

你会怎么做?

标签: python-3.xkivy

解决方案


Clock.schedule_interval调用放在画布块中不会满足这些调用在画布块中发生的要求。with当代码很久以前退出该块时,它们会在稍后执行。你可以做的是使用相同的结构,但在__init__updateEllipse指令周围。

此外,您决不会将您的RandomPoint小部件添加到您的根小部件中,因此无论其指令发生什么,它都不会可见。

class RandomPoint(Widget):
    def __init__(self,dimension):
        super(RandomPoint,self).__init__()
        self.d = dimension
        self.points = []
        with self.canvas:
            self.point.append(Ellipse(pos=list(np.random.randint(0,1000,2)),size = (self.d, self.d)))

def update(self, *args):
    with self.canvas:
        self.points.append(Ellipse(pos=list(np.random.randint(0,1000,2)),size = (self.d, self.d)))

class TimeApp(App):
    def build(self):
        wid = Widget()
        p = RandomPoint(25)
        wid.add_widget(p)
        Clock.schedule_interval(p.update, 1)
        return wid

TimeApp().run()

推荐阅读