Skip to content

Commit

Permalink
Adjusts some minor code-structural issues and adds some comments.
Browse files Browse the repository at this point in the history
see #1 and #2

- put UI initialization in extra method
- add comments for ui-initialization
- rename "mouseFun" to "handleCanvasClick"
- add hyphen to "pre-render" in all cases that do not correspond to variable/function names
  • Loading branch information
pfaion committed Jan 6, 2017
1 parent b0c323b commit 521beda
Showing 1 changed file with 47 additions and 32 deletions.
79 changes: 47 additions & 32 deletions MPLAnimator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,18 @@
import matplotlib.backend_bases




class Animator:

def __init__(self, name = None, setup_handle = None):
def __init__(self, name=None, setup_handle=None):
self.qApp = QtWidgets.QApplication([])

self.w = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
self.w.setLayout(layout)

self.stack = QtWidgets.QStackedLayout()
layout.addLayout(self.stack)

self.label = QtWidgets.QLabel()
self.stack.addWidget(self.label)
self.fig = plt.figure()
self.canvas = FigureCanvas(self.fig)
self.stack.addWidget(self.canvas)

self.canvas.mpl_connect('button_press_event', self.mouseFun)

self.slider = QtWidgets.QSlider(Qt.Horizontal)
self.slider.valueChanged.connect(self.visualize)
layout.addWidget(self.slider)

self.prerender_checkbox = QtWidgets.QCheckBox("Prerendered")
layout.addWidget(self.prerender_checkbox)
self.initUI()

self.prerendered = None

# use the name as identifier for the saved pre-rendered images
# if no name is specified, create random temporary directory for pre-rendered images
# (this will be deleted after program execution!)
self.name = name
if name == None:
self.tmpdir = tempfile.TemporaryDirectory()
Expand All @@ -54,30 +35,62 @@ def __init__(self, name = None, setup_handle = None):
if not os.path.exists(self.dir):
os.makedirs(self.dir)

if setup_handle != None:
if setup_handle:
setup_handle()

def setFrameCallback(self, frame_handle, max_frame):
self.frame_handle = frame_handle

def initUI(self):
# main widget with vbox-layout for displaying the figure at the top and the controls below
self.w = QtWidgets.QWidget()
self.layout = QtWidgets.QVBoxLayout()
self.w.setLayout(self.layout)

# using a stacked layout for the figure
# allows for quick exchange between pre-rendered image-view vs matplotlib figure
self.stack = QtWidgets.QStackedLayout()
self.layout.addLayout(self.stack)
self.label = QtWidgets.QLabel()
self.stack.addWidget(self.label)
self.fig = plt.figure()
self.canvas = FigureCanvas(self.fig)
self.stack.addWidget(self.canvas)
self.canvas.mpl_connect('button_press_event', self.handleCanvasClick)

# the primary control slider for frame selection
self.slider = QtWidgets.QSlider(Qt.Horizontal)
self.slider.valueChanged.connect(self.visualize)
self.layout.addWidget(self.slider)

# checkbox for toggling pre-rendered mode
self.prerender_checkbox = QtWidgets.QCheckBox("Pre-rendered")
self.layout.addWidget(self.prerender_checkbox)


def setFrameCallback(self, frame_cb, max_frame):
self.frame_cb = frame_cb
self.max_frame = max_frame
self.slider.setMaximum(max_frame - 1)


def setClickCallback(self, click_cb):
self.click_cb = click_cb


def rerender(self):
self.clear()
self.prerender()


def prerender(self):
if len(os.listdir(self.dir)) == 0:
print("prerendering images...")
print("pre-rendering images...")
for i in range(self.max_frame):
print("rendering frame {}/{}".format(i + 1, self.max_frame))
self.frame_handle(i)
self.frame_cb(i)
plt.savefig("{}/{}.png".format(self.dir, i))

def mouseFun(self, event: matplotlib.backend_bases.MouseEvent):

def handleCanvasClick(self, event: matplotlib.backend_bases.MouseEvent):
self.click_cb(**(event.__dict__))
self.visualize()

Expand All @@ -95,14 +108,16 @@ def visualize(self, i = None):
else:
if self.stack.currentWidget() != self.canvas:
self.stack.setCurrentWidget(self.canvas)
self.frame_handle(i)
self.frame_cb(i)
self.canvas.draw()


def clear(self):
for file in os.listdir(self.dir):
os.remove(self.dir + "/" + file)

def run(self, clear = False, prerendered = True, initialFrame = 0):

def run(self, clear=False, prerendered=True, initialFrame=0):
if clear:
self.clear()
if prerendered:
Expand Down

0 comments on commit 521beda

Please sign in to comment.