Example #1
0
    def __init__(self, root):
        #
        # Basic frame initialization
        #

        super().__init__(root)

        #
        # First of all, get config manager up and running so we have access to any settings that it manages for us
        #

        self._config_manager = ConfigManager()

        #
        # Initialise all internal settings not related to UI components
        #

        self.tracks = get_all_tracks()
        self.current_track = self.tracks[
            self._config_manager.get_last_open_track()]

        self.log = None
        self.filtered_episodes = None

        self.episode_filter = EpisodeFilter()
        self.view_manager = ViewManager()
        self.action_space_filter = ActionSpaceFilter()
        self.episode_selector = EpisodeSelector()
        self.sector_filter = ""

        #
        # Create the simple high level UI components (the canvas, control frame and status frame)
        #

        self.status_frame = StatusFrame(self)

        self.track_canvas = tk.Canvas(self,
                                      bg="black",
                                      width=DEFAULT_CANVAS_WIDTH,
                                      height=DEFAULT_CANVAS_HEIGHT)
        self.track_canvas.bind("<Configure>", self.redraw)
        self.track_canvas.bind("<Button-3>",
                               self.right_button_pressed_on_track_canvas)
        self.track_canvas.bind("<Left>",
                               self.left_or_down_key_pressed_on_track_canvas)
        self.track_canvas.bind("<Up>",
                               self.right_or_up_key_pressed_on_track_canvas)
        self.track_canvas.bind("<Right>",
                               self.right_or_up_key_pressed_on_track_canvas)
        self.track_canvas.bind("<Down>",
                               self.left_or_down_key_pressed_on_track_canvas)

        self.track_canvas.bind("<Button-1>",
                               self.left_button_pressed_on_track_canvas)
        self.track_canvas.bind("<B1-Motion>",
                               self.left_button_moved_on_track_canvas)
        self.track_canvas.bind("<ButtonRelease-1>",
                               self.left_button_released_on_track_canvas)

        self.control_frame = tk.Frame(root)
        self.inner_control_frame = tk.Frame(self.control_frame)

        #
        # Initialise variables to control the right mouse zoom-in feature over a canvas
        #

        self.zoom_start_x = None
        self.zoom_start_y = None
        self.zoom_widget = None

        #
        # Create the graph plotting UI components using the magic of matplotlib
        #

        graph_figure = Figure(figsize=(5, 4), dpi=100)
        matplotlib_canvas = FigureCanvasTkAgg(graph_figure, master=self)
        self.graph_canvas = matplotlib_canvas.get_tk_widget()
        self.graph_canvas.config(width=DEFAULT_CANVAS_WIDTH,
                                 height=DEFAULT_CANVAS_HEIGHT)

        #
        # Initialize the "please wait" widget in the middle of each canvas
        #

        self.please_wait_track = PleaseWait(root, self.track_canvas)
        self.please_wait_graph = PleaseWait(root, self.graph_canvas)
        self.please_wait = self.please_wait_track

        #
        # Create the various "analyzers" and let them take control of the contents of the high level UI components
        #

        self.track_graphics = TrackGraphics(self.track_canvas)
        self.current_track.configure_track_graphics(self.track_graphics)

        self.analyze_route = AnalyzeRoute(self.redraw, self.track_graphics,
                                          self.inner_control_frame,
                                          self.episode_selector,
                                          self._config_manager)
        self.analyze_track_heatmap = AnalyzeHeatmap(self.redraw,
                                                    self.track_graphics,
                                                    self.inner_control_frame,
                                                    self.please_wait_track,
                                                    self._config_manager)
        self.analyze_exit_points = AnalyzeExitPoints(self.redraw,
                                                     self.track_graphics,
                                                     self.inner_control_frame)
        self.analyze_race = AnalyzeRace(self.redraw, self.track_graphics,
                                        self.inner_control_frame)
        self.analyze_curve_fitting = AnalyzeCurveFitting(
            self.redraw, self.track_graphics, self.inner_control_frame)
        self.analyze_straight_fitting = AnalyzeStraightFitting(
            self.redraw, self.track_graphics, self.inner_control_frame)
        self.analyze_training_progress = AnalyzeTrainingProgress(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_quarterly_results = AnalyzeQuarterlyResults(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_reward_distribution = AnalyzeRewardDistribution(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_common_rewards = AnalyzeCommonRewards(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_rewards_per_waypoint = AnalyzeRewardsPerWaypoint(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_episode_speed = AnalyzeEpisodeSpeed(
            self.redraw, matplotlib_canvas, self.inner_control_frame,
            self.episode_selector)
        self.analyze_episode_reward = AnalyzeEpisodeReward(
            self.redraw, matplotlib_canvas, self.inner_control_frame,
            self.episode_selector, self._config_manager)
        self.analyze_episode_slide = AnalyzeEpisodeSlide(
            self.redraw, matplotlib_canvas, self.inner_control_frame,
            self.episode_selector)
        self.analyze_episode_action_distribution = AnalyzeEpisodeActionDistribution(
            self.redraw, matplotlib_canvas, self.inner_control_frame,
            self.episode_selector)
        self.analyze_lap_time_correlations = AnalyzeLapTimeCorrelations(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_sector_time_correlations = AnalyzeSectorTimeCorrelations(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_lap_time_distribution = AnalyzeLapTimeDistribution(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_complete_lap_percentage = AnalyzeCompleteLapPercentage(
            self.redraw, matplotlib_canvas, self.inner_control_frame)
        self.analyze_discount_factors = AnalyzeDiscountFactors(
            self.redraw, matplotlib_canvas, self.inner_control_frame)

        self.all_analyzers = [
            self.analyze_route, self.analyze_track_heatmap,
            self.analyze_exit_points, self.analyze_race,
            self.analyze_curve_fitting, self.analyze_straight_fitting,
            self.analyze_training_progress, self.analyze_quarterly_results,
            self.analyze_reward_distribution, self.analyze_common_rewards,
            self.analyze_rewards_per_waypoint, self.analyze_episode_speed,
            self.analyze_episode_reward, self.analyze_episode_slide,
            self.analyze_episode_action_distribution,
            self.analyze_lap_time_correlations,
            self.analyze_sector_time_correlations,
            self.analyze_lap_time_distribution,
            self.analyze_complete_lap_percentage, self.analyze_discount_factors
        ]

        for v in self.all_analyzers:
            v.set_track(self.current_track)

        self.analyzer = self.analyze_route
        self.background_analyzer = None
        self.analyzer.take_control()

        if ss.SHOW_SS:
            self.secret_analyzers = ss.get_secret_analyzers(
                self.redraw, self.track_graphics, self.inner_control_frame)
        else:
            self.secret_analyzers = None

        #
        # Define the layout of the high level UI components
        #

        self.layout_ui_for_track_analyzer()

        #
        # Configure the rest of the application window and then make it appear
        #

        self.master.title("Deep Racer Guru v" + VERSION)
        self.menu_bar = MenuBar(root, self, False)

        #
        # All done, so display main window now
        #

        self.already_drawing = False
        self.update()

        #
        # And now lock-in the sizes of the control and status frames so switches between views will be smooth
        #

        self.control_frame.pack_propagate(0)
        self.control_frame.grid_propagate(0)

        self.status_frame.pack_propagate(0)
        self.status_frame.grid_propagate(0)
Example #2
0
    def __init__(self, root):
        #
        # Basic frame initialization
        #

        super().__init__(root)

        #
        # Initialise all internal settings not related to UI components
        #

        self.tracks = get_all_tracks()
        self.current_track = self.tracks["FS_June2020"]

        self.log = None
        self.filtered_episodes = None

        self.episode_filter = EpisodeFilter()
        self.view_manager = ViewManager()
        self.action_space_filter = ActionSpaceFilter()

        #
        # Go to the correct directory where the log files are located, ready to load or save them there
        #

        chdir(config.LOG_DIRECTORY)

        #
        # Create the high level UI components (the canvas, control frame and status frame)
        #

        self.status_frame = StatusFrame(self)

        self.track_canvas = tk.Canvas(self, bg="black", width=700, height=500)
        self.track_canvas.bind("<Configure>", self.redraw)
        self.track_canvas.bind("<Button-1>",
                               self.left_button_pressed_on_track_canvas)
        self.track_canvas.bind("<Left>",
                               self.left_or_down_key_pressed_on_track_canvas)
        self.track_canvas.bind("<Up>",
                               self.right_or_up_key_pressed_on_track_canvas)
        self.track_canvas.bind("<Right>",
                               self.right_or_up_key_pressed_on_track_canvas)
        self.track_canvas.bind("<Down>",
                               self.left_or_down_key_pressed_on_track_canvas)

        self.control_frame = tk.Frame(root)

        #
        # Create the various "analyzers" and let them take control of the contents of the high level UI components
        #

        self.track_graphics = TrackGraphics(self.track_canvas)
        self.analyze_route = AnalyzeRoute(self.redraw, self.track_graphics,
                                          self.control_frame)
        self.analyze_convergence = AnalyzeConvergence(self.redraw,
                                                      self.track_graphics,
                                                      self.control_frame)

        self.analyzer = self.analyze_route
        self.all_analyzers = [self.analyze_route, self.analyze_convergence]
        self.analyzer.set_track(self.current_track)
        self.analyzer.take_control()

        if ss.SHOW_SS:
            self.secret_analyzers = ss.get_secret_analyzers(
                self.redraw, self.track_graphics, self.control_frame)
        else:
            self.secret_analyzers = None

        #
        # Define the layout of the high level UI components
        #

        self.status_frame.pack(side=tk.BOTTOM)
        self.track_canvas.pack(fill=tk.BOTH, expand=True, side=tk.LEFT)
        self.control_frame.pack(side=tk.RIGHT)
        self.pack(fill=tk.BOTH, expand=True)

        #
        # Configure the rest of the application window and then make it appear
        #

        self.master.title("Deep Racer Guru")
        self.menu_bar = MenuBar(root, self, False)

        #
        # All done, so display main window now
        #

        self.update()