123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- # Only ask users to install matplotlib if they actually need it
- try:
- import matplotlib.pyplot as plt
- except ImportError:
- raise ImportError(
- "To display the environment in a window, please install matplotlib, eg: `pip3 install --user matplotlib`"
- )
- class Window:
- """
- Window to draw a gridworld instance using Matplotlib
- """
- def __init__(self, title):
- self.no_image_shown = True
- # Create the figure and axes
- self.fig, self.ax = plt.subplots()
- # Show the env name in the window title
- self.fig.canvas.manager.set_window_title(title)
- # Turn off x/y axis numbering/ticks
- self.ax.xaxis.set_ticks_position("none")
- self.ax.yaxis.set_ticks_position("none")
- _ = self.ax.set_xticklabels([])
- _ = self.ax.set_yticklabels([])
- # Flag indicating the window was closed
- self.closed = False
- def close_handler(evt):
- self.closed = True
- self.fig.canvas.mpl_connect("close_event", close_handler)
- def show_img(self, img):
- """
- Show an image or update the image being shown
- """
- # If no image has been shown yet,
- # show the first image of the environment
- if self.no_image_shown:
- self.imshow_obj = self.ax.imshow(img, interpolation="bilinear")
- self.no_image_shown = False
- # Update the image data
- self.imshow_obj.set_data(img)
- # Request the window be redrawn
- self.fig.canvas.draw_idle()
- self.fig.canvas.flush_events()
- # Let matplotlib process UI events
- plt.pause(0.001)
- def set_caption(self, text):
- """
- Set/update the caption text below the image
- """
- plt.xlabel(text)
- def reg_key_handler(self, key_handler):
- """
- Register a keyboard event handler
- """
- # Keyboard handler
- self.fig.canvas.mpl_connect("key_press_event", key_handler)
- def show(self, block=True):
- """
- Show the window, and start an event loop
- """
- # If not blocking, trigger interactive mode
- if not block:
- plt.ion()
- # Show the plot
- # In non-interative mode, this enters the matplotlib event loop
- # In interactive mode, this call does not block
- plt.show()
- def close(self):
- """
- Close the window
- """
- plt.close()
- self.closed = True
|