raw_input in matplotlib with plot interaction
Posted on 08 August 2012 in misc
This page was originally published on blog.procrastination.nl, which is still on-line for archival purposes.
When working with data, you sometimes need to view the data and give input on how to continue. However, a simple
plot([1,2],[1,2]) answer = raw_input()will not work: the plot GUI will block while the raw_input() is waiting. The following is a (admittedly hacky) solution to this problem: run raw_input() in a seperate thread, and poll the GUI using waitforbuttonpress():
import threading import matplotlib from __builtin__ import raw_input as original_raw_input def raw_input(*args, **kwargs): value = [] ri = lambda: value.append(original_raw_input(*args, **kwargs)) t = threading.Thread(target=ri) t.start() while t.isAlive(): if matplotlib._pylab_helpers.Gcf.get_all_fig_managers(): matplotlib.pylab.waitforbuttonpress(timeout=0.1) else: t.join() return value[0] raw_input.__doc__ = original_raw_input.__doc__ if __name__=="__main__": plot([1,2],[1,2]) print raw_input("...> ")When a value is entered, the program might wait (for up to 0.1s), which is a fairly minor issue. There's probably also a way to deadlock it - but hey, a data analysis script is not production code ;-)