簡體   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