繁体   English   中英

使用Python进行粒子过滤的Gui

[英]Gui for Particlefilter with Python

我正在尝试实现粒子过滤器,因此选择了python,因为我有点喜欢python。 现在,我已经使用tkinter和python 3.4编写了我的GUI。

我使用tkinter.canvas对象显示地图(已加载PIL的png图像),然后为每个粒子创建点,例如:

点= canvas.create_oval(x,y,x + 1,y + 1)

当机器人移动时,我会根据机器人的控制命令来计算每个粒子的新位置,粒子位置和粒子对齐方式。 移动tkinter.canvas粒子有两种方法:

canvas.move()
canvas.coords()

但是这两种方法似乎都可以立即更新gui,这在有大约100个粒子的情况下是可以的,但如果有200-5000个则不行(对于全局本地化,我实际上应该有什么)。 所以我的问题是gui的性能。

所以我的实际问题是:tkinter中是否有办法阻止画布更新gui,然后更改gui,然后再次更新gui? 还是可以为我推荐一个比我的用例更好的模块?

您的观察不正确。 画布不会立即更新。 在事件循环能够处理事件之前,椭圆不会重绘。 在重新绘制画布之前,很可能会更新数千个对象。 但是,画布并不是一种高性能的工具,因此以高帧频移动成千上万个对象将非常困难。

如果您看到该对象立即被更新,则可能是因为您在代码中的某个位置调用了updateupdate_idletasks ,否则您将允许事件循环运行。

那么,对该问题的具体答案是确保在更改所有粒子的坐标之前,不要调用updateupdate_idletasks ,或者让事件循环处理事件。

以下是一个简短的示例。 运行时,请注意所有粒子每隔一秒便一次移动。 这是因为所有计算都在允许事件循环在画布上重画项目之前完成。

import Tkinter as tk
import random

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.canvas = tk.Canvas(self, width=500, height=500, background="black")
        self.canvas.pack(fill="both", expand=True)

        self.particles = []
        for i in range(1000):
            x = random.randint(1, 499)
            y = random.randint(1, 499)
            particle = self.canvas.create_oval(x,y,x+4,y+4,
                                               outline="white", fill="white")
            self.particles.append(particle)

        self.animate()


    def animate(self):
        for i, particle in enumerate(self.particles):
            deltay = (2,4,8)[i%3]
            deltax = random.randint(-2,2)
            self.canvas.move(particle, deltax, deltay)

        self.after(30, self.animate)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM