[英]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? 還是可以為我推薦一個比我的用例更好的模塊?
您的觀察不正確。 畫布不會立即更新。 在事件循環能夠處理事件之前,橢圓不會重繪。 在重新繪制畫布之前,很可能會更新數千個對象。 但是,畫布並不是一種高性能的工具,因此以高幀頻移動成千上萬個對象將非常困難。
如果您看到該對象立即被更新,則可能是因為您在代碼中的某個位置調用了update
, update_idletasks
,否則您將允許事件循環運行。
那么,對該問題的具體答案是確保在更改所有粒子的坐標之前,不要調用update
或update_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.