|  | 
 Here is a GUI for Evaluating Arithmetic Expressions| The Finished GUI application is shown at the right.  
The idea behind the application is
to allow the user to evaluate any arithmetic expression and display the result in a desired format. |   | 
 To begin, open a terminal window or DOS window and enter any of:
 
1) ./run_happy.py       (Linux)
2) run_happy.py         (Windows)
3) python run_happy.py  (Both) 
 | Select a Label Widget on the Main Form to be added to the GUI application.
Click on the Form Window at the location of the Label.  Use the blue grab-handles
to size the label. |   |   | 
 | Continue selecting, placing, and editing widgets until all of the desired components
are on the Form Window. |   | 
 | It is now time to save the project.  From the Main Window choose "File>Saveas".
Enter "eval_gui" in the dialog box and the project will be saved under that name.
Two files result from this save operation: 1) a definition file (eval_gui.def)
 2) a python source file (eval_gui.py).
 |   | 
 | The resulting python file is fully functional.
The button, listbox, entry string variable, etc. are "wired" and ready to go.
Go ahead and run the python file "eval_gui.py".  As you click the button or listbox,
or change the expression in the entry field, notice the print outputs to the terminal 
window or DOS box that indicate the "pre-wired" condition.All that remains is to edit the python file to implement your own logic.
 | 
 
        Insert Lines to implement your logic
    Inserted Code is in GREENDelete or Comment Out "Place-Holder" Code     Code to be Deleted or Commented is in RED
#!/usr/bin/env python
# NOTICE... this file is generated by tk_happy.
# Any code or comments added by the user must be in designated areas ONLY.
# User additions will be lost if they are placed in code-generated areas.
# tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "imports"
from Tkinter import *
# >>>>>>insert any user code below this comment for section "imports"
# Place any user import statements here
from math import *# tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "top_of_init"
class _Eval_Gui:
    def __init__(self, master):
        self.initComplete = 0
        frame = Frame(master, width=300, height=198, background="#ffffb9")
        frame.pack()
        self.master = master
        self.x, self.y, self.w, self.h = -1,-1,-1,-1
        
        # bind master to  in order to handle any resizing, etc.
        # postpone self.master.bind("", self.Master_Configure)
        self.master.bind('', self.bindConfigure)
        
        self.master.title("eval_gui")
        self.Calcbtn_Button = Button(self.master,text="Calculate", \
            background="#ffcccc", width="15")
        self.Calcbtn_Button.place(x=24, y=120, width=132, height=27)
        self.Calcbtn_Button.bind("", self.Calcbtn_Button_Click)
        self.Eqnentry = Entry(self.master,width="15")
        self.Eqnentry.place(x=24, y=36, width=254, height=22)
        self.Eqnentry_StringVar = StringVar()
        self.Eqnentry.configure(textvariable=self.Eqnentry_StringVar)
        self.Eqnentry_StringVar.set("sqrt( 2.0 )")
        self.Eqnentry_StringVar_traceName = \
            self.Eqnentry_StringVar.trace_variable("w", self.Eqnentry_StringVar_Callback)
        self.Answerlbl_Label = Label(self.master,text="", background="#c2efef", width="15")
        self.Answerlbl_Label.place(x=24, y=84, width=132, height=24)
        self.Label_1 = Label(self.master,text="Expression to be Evaluated", \
            background="#ffffb9", width="15")
        self.Label_1.place(x=24, y=12, width=239, height=22)
        self.Label_2 = Label(self.master,text="Answer", background="#ffffb9", width="15")
        self.Label_2.place(x=36, y=60, width=99, height=22)
        self.Label_4 = Label(self.master,text="Format", background="#ffffb9", width="15")
        self.Label_4.place(x=180, y=60, width=97, height=20)
        lbframe = Frame( self.master )
        self.Listbox_1_frame = lbframe
        scrollbar = Scrollbar(lbframe, orient=VERTICAL)
        self.Listbox_1 = Listbox(lbframe, width="15", selectmode="single", \
            yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.Listbox_1.yview)
        scrollbar.pack(side=RIGHT, fill=Y)
        self.Listbox_1.pack(side=LEFT, fill=BOTH, expand=1)
        self.Listbox_1_frame.place(x=180, y=84, width=90, height=99)
        self.Listbox_1.bind("", self.Listbox_1_Click)
        self.master.resizable(0,0) # Linux may not respect this
        # >>>>>>insert any user code below this comment for section "top_of_init" 
        # populate the listbox with desired formats
        self.Listbox_1.insert(END, "None")
        self.Listbox_1.insert(END, "%g")
        self.Listbox_1.insert(END, "%.1f")
        self.Listbox_1.insert(END, "%.2f")
        self.Listbox_1.insert(END, "%.3f")
        self.Listbox_1.insert(END, "%.4f")
        self.Listbox_1.insert(END, "%.1E")
        self.Listbox_1.insert(END, "%.2E")
        self.Listbox_1.insert(END, "%.3E")
        self.Listbox_1.insert(END, "%.4E")
        self.Listbox_1.select_set(0) # make None highlighted
        
        self.master.title("Expression Evaluator")
    # showAnser function will evaluate and display result
    def showAnswer(self):
        s = self.Eqnentry_StringVar.get()
        print 'evaluating:',s
        try:
            val = eval(s)
        except:
            val = 'ERROR'
            
        try:
            fmt = self.Listbox_1.get(self.Listbox_1.curselection())
            valStr = fmt%val
        except:
            valStr = str( val )
            
        self.Answerlbl_Label.config( text=valStr )
        # tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "Master_Configure"
    def bindConfigure(self, event):
        if not self.initComplete:
            self.master.bind("", self.Master_Configure)
            self.initComplete = 1
    def Master_Configure(self, event):
        pass
        # >>>>>>insert any user code below this comment for section "Master_Configure"
        # replace, delete, or comment-out the following
        if event.widget != self.master:
            if self.w != -1:
                return
        x = int(self.master.winfo_x())
        y = int(self.master.winfo_y())
        w = int(self.master.winfo_width())
        h = int(self.master.winfo_height())
        if (self.x, self.y, self.w, self.h) == (-1,-1,-1,-1):
            self.x, self.y, self.w, self.h = x,y,w,h
        if self.w!=w or self.h!=h:
            print "Master reconfigured... make resize adjustments"
            self.w=w
            self.h=h
    # tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "compID=1"
    def Calcbtn_Button_Click(self, event): #click method for component ID=1
        pass
        # >>>>>>insert any user code below this comment for section "compID=1"
        # replace, delete, or comment-out the following         print "executed method Calcbtn_Button_Click"         # When button is clicked, reset format to None, Then show answer
        self.Listbox_1.selection_clear(self.Listbox_1.curselection())
        self.Listbox_1.select_set(0) # make None highlighted
        self.showAnswer()# tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "compID=4"
    def Listbox_1_Click(self, event): #click method for component ID=4
        pass
        # >>>>>>insert any user code below this comment for section "compID=4"
        # replace, delete, or comment-out the following         self.showAnswer()         print "executed method Listbox_1_Click"
        print "current selection(s) =",self.Listbox_1.curselection()
        labelL = []
        for i in self.Listbox_1.curselection():
            labelL.append( self.Listbox_1.get(i))
        print "current label(s) =",labelL  
        # use self.Listbox_1.insert(0, "item zero")
        #     self.Listbox_1.insert(index, "item i")
        #            OR
        #     self.Listbox_1.insert(END, "item end")
        #   to insert items into the list box# tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "Eqnentry_StringVar_Callback"
    def Eqnentry_StringVar_Callback(self, varName, index, mode):
        pass
        # >>>>>>insert any user code below this comment for section "Eqnentry_StringVar_Callback"
        # replace, delete, or comment-out the following         print "Eqnentry_StringVar_Callback varName, index, mode",varName, index, mode
        print "    new StringVar value =",self.Eqnentry_StringVar.get()# tk_happy generated code. DO NOT EDIT THE FOLLOWING. section "end"
def main():
    root = Tk()
    app = _Eval_Gui(root)
    root.mainloop()
if __name__ == '__main__':
    main() A Finished/Working GUI is just a few clicks away. |