.. _how_to_gui: ========================== How to make a gui software ========================== Toolkit ======= The simplest way of wrapping CUI is using Tkinter. It is a powerful GUI toolkit, and the advantage is the needs of no installation. I also tried easygui, but slightly too less for me. It is easy, but multiple window is not supported well. Also, it was announced in 2013 that the support is finished. Template ======== Single GUI software ------------------- You may refer to :class:`irfpy.util.tk.PyanaFrame` as a start point. Sample GUI program is .. code-block:: py ### Need for the template import Tkinter as Tk import irfpy.util.tk ### These imports are needed for "go" function. import dateutil.parser import matplotlib.pyplot as plt import vima_extra_emae class Frame(irfpy.util.tk.PyanaFrame): def __init__(self, master=None): irfpy.util.tk.PyanaFrame.__init__(self, master) def framename(self): return 'vima_extra_emae' def create_widget(self): frm = self.mf # All the widget is made under self.mf timefield_lf = Tk.LabelFrame(frm, text='Time to plot') timefield_lf.grid(row=1, column=1, columnspan=2, padx=5, pady=5) self.timefield = Tk.Entry(timefield_lf) self.timefield.delete(0, Tk.END) self.timefield.insert(0, '2007-10-09T23:30:00') self.timefield.pack() frm.pack() # Widget is shown now. def go(self): t0 = dateutil.parser.parse(self.timefield.get()) print t0 plt.ion() vima_extra_emae.execplot(t0) def main(): root = Tk.Tk() f = Frame(root) f.pack() root.mainloop() if __name__ == '__main__': main() This sample is a short version in ``vima_extra_emae_ui`` script in irfpy.aspera project. If you run the script from python, you can see a single window that can specify the time of the plot. Collection of GUI ----------------- GUI for collection of single GUI programs can also be made. A template follows. It comes from ``apps_130622_veximaextra.vima_extra_ui.py``. .. code-block:: py ''' Interface using TKinter ''' import logging logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) from irfpy.util.future import OrderedDict import datetime import dateutil.parser import functools import Tkinter as Tk import matplotlib.pyplot as plt import irfpy.util.tk import vima_extra_emae_ui import vima_extra_et_ui class Frame(Tk.Frame): def __init__(self, master=None): Tk.Frame.__init__(self, master) self.master.title('vima_extra_tkinter') self.choices = OrderedDict([ ['-' * 20 + ' Select the plot type' + '-' * 20, (lambda: None)], ['Energy-time diagram of VEX IMAEXTRA for H+, O+, and rest', irfpy.util.tk.functoplevel(vima_extra_et_ui.Frame)], ['Mass separated 2D plots (Ene-Az-El-Mass) using VEX IMAEXTRA', irfpy.util.tk.functoplevel(vima_extra_emae_ui.Frame)], ]) choicekeys = tuple(self.choices.keys()) self.optionmenu_value = Tk.StringVar() self.optionmenu_value.set(choicekeys[0]) optionmenu = Tk.OptionMenu(self, self.optionmenu_value, *choicekeys) optionmenu.grid(row=0, column=0, columnspan=4, padx=5, pady=5) self.b_plot = Tk.Button(self, text='Select', command=self.plot) self.b_plot.grid(row=2, column=0, columnspan=2, padx=5, pady=5) self.b_quit = Tk.Button(self, text='Quit', command=self.quit) self.b_quit.grid(row=2, column=2, columnspan=2, padx=5, pady=5) def plot(self): plottype = self.optionmenu_value.get() logging.info('Plottype= %s' % plottype) self.choices[plottype]() def main(): root = Tk.Tk() f = Frame(root) f.pack() root.mainloop() if __name__ == '__main__': main() You can only change the contents ``self.choices``, then you may get different set of the GUI softwares starting from a single window. .. todo:: The class should be more genralized and to be "template" class.