from __future__ import annotations from collections import deque from math import cos, sin from threading import Event, Thread from time import sleep from typing import Any import dearpygui.dearpygui as _dpg import dpg_map as dpgm dpg: Any = _dpg def main() -> None: dpgm.configure(user_agent="dpg-map trajectory_live_thread example") stop = Event() points: deque[tuple[float, float]] = deque(maxlen=240) dpg.create_context() dpg.create_viewport(title="dpg-map live trajectory", width=1000, height=700) with ( dpg.window(label="Live Trajectory", width=-1, height=-1), dpgm.map_widget( tag="live-trajectory-map", center=(47.9029, 1.9093), zoom=15, width=-1, height=-1, ), ): dpgm.add_trajectory( "track", points=[], color=(250, 190, 80, 255), thickness=3.0, show_points=True, point_stride=12, ) dpgm.add_marker( "head", lat=47.9029, lon=1.9093, color=(72, 205, 154, 255), radius=6, ) def update_trajectory() -> None: tick = 0 while not stop.is_set(): angle = tick * 0.06 lat = 47.9029 + sin(angle) * 0.0016 + sin(angle * 2.7) * 0.00025 lon = 1.9093 + cos(angle) * 0.0016 points.append((lat, lon)) snapshot = tuple(points) dpgm.update_trajectory("track", points=snapshot, map_tag="live-trajectory-map") dpgm.update_marker("head", lat=lat, lon=lon, map_tag="live-trajectory-map") tick += 1 sleep(1 / 20) worker = Thread(target=update_trajectory, name="dpg-map-live-trajectory", daemon=True) worker.start() try: dpg.setup_dearpygui() dpg.show_viewport() dpg.start_dearpygui() finally: stop.set() worker.join(timeout=1.0) dpg.destroy_context() if __name__ == "__main__": main()