330 likes | 466 Views
Programming for Engineers in Python. Recitation 11. Plan. GUI Swampy Text widgets PyPad. Install Swampy. Download Swampy: http://greenteapress.com/thinkpython/swampy/swampy-2.0.python2.zip Unzip to C: Python27Libsite-packages
E N D
Programming for Engineers in Python Recitation 11
Plan • GUI • Swampy • Text widgets • PyPad
Install Swampy • Download Swampy: • http://greenteapress.com/thinkpython/swampy/swampy-2.0.python2.zip • Unzip to C:\Python27\Lib\site-packages • Now you should have a directory C:\Python27\Lib\site-packages\swampy-2.0 • Download this file http://db.tt/gQqPvRok (it might open as a text file, right click and choose ‘Save as…’) and also put it in C:\Python27\Lib\site-packages, making sure its name is swampy.pth • Now you should have a file C:\Python27\Lib\site-packages\swampy.pth
Check Swampy was installed • Open the shell (IDLE) • Run the following commands to check that Swampy is working: >>> importTkinter >>> fromGuiimport* >>> g=Gui() >>> g.mainloop() • If you see a window like this -> then the installation worked
GUI - reminder • Graphical User Interface • The part of the program that communicates with the human user • Computer → Human: graphics (sometimes audio & even vibrations) • Human →Computer: keyboard & mouse (sometimes even touchscreen & microphone) • In many applications this is the most important part of the program
History of GUI http://www.youtube.com/watch?v=TZGGUrom1Mg
Widgets • In class: • Button • Label • Canvas
More widgets! • Textual input widgets: • Entry – single line entry_example.py: https://gist.github.com/1523427 • Text – multiple lines text_example.py: https://gist.github.com/1523471 Think Python 19.5
More complex example • Change the color of a circle based on the color name given by the user circle_demo.py: thinkpython.com/code/circle_demo.py Think Python 19.5 pg. 185
Packing >>> g = Gui() >>> g.title('PyNote 0.1') Creates the GUI & title
Packing >>> g.col(weights=[1,0]) Creates a column that holds widgets Weights – later…
Packing >>> g.st(…) st: Scrollable text widget
Packing >>> g.row(weights=[1,0,0,0]) Creates a row that holds widgets • The weights option determines which widget is resized and by how much when the window is resized
Resizing • With weights=[1,0,0,0] • Without specifying weights
Packing filename = g.en(text='filename.txt', width=16) g.bu(text='...', command=browse) g.bu(text='Save', command=save) g.bu(text='Load', command=load) g.bu(text='New', command=new) g.bu(text='Quit', command=quit_) g.bu: button widget g.en: entry widget (one line of text)
Check if a file exists • os.path.exists(filename) • Returns True if file exists, False if it does not
Command g.bu(text='Save', command=save) defsave(): '''Saves the current note in a file''' if exists(filename.get()): # exists is os.path.exists ifnottkMessageBox.askyesno ('Save','File already exists, do you want to overwrite?'): return f = open(filename.get(),'w') f.write(textbox.text.get(0.0, END)) f.close() tkMessageBox.showinfo('Save','File saved: ‘ +filename.get())
Event driven programming • Nothing happens until the user initiates an event • When the user clicks the button the command is called • Now the GUI is “frozen” until the command returns • When it returns, the GUI is released >>> deffreeze(): time.sleep(5) >>> g=Gui() >>> g.bu(text=‘Freeze!’,command=freeze) >>> g.mainloop()
http://www.tutorialspoint.com/python/tk_messagebox.htm tkMessageBox • Creates a message box that asks the user a question or gives him information • Usually with a button or two • Examples: tkMessageBox.showinfo('Load','Filedoes not exist: '+filename.get()) tkMessageBox.askyesno('Save','File already exists, do you want to overwrite?') tkMessageBox.askyesno('Quit?','Do you want to quit?')
tkMessageBox.askyesno('Save','File already exists, do you want to overwrite?')
tkMessageBox.showinfo('Load','Filedoes not exist: ‘ + filename.get())
Load command defload(): '''Opens a file to the text widget''' ifnot exists(filename.get()): tkMessageBox.showinfo('Load','File does not exist: ' +filename.get()) return new() # delete previous note from text widget f = open(filename.get()) t = f.read() textbox.text.insert(0.0, t) f.close()
File dialog box • We can get the file by writing/copy-pasting its name, but it’s easier with a file dialog box: t = tkFileDialog.askopenfilename()
File dialog box – contd. • We use the dialog box in the browse function which is called by the ‘…’ button defbrowse(): '''opens a file dialog and sets its result to the filename entry''' t = tkFileDialog.askopenfilename() if t: filename.delete(0,END) filename.insert(0,t)
Exit the GUI • User: • By clicking the windows X icon • By pressing Ctrl-C in the shell • Program: • By calling g.destroy() • Example – quit_() function (‘_’ is used in the name because quit is a python word): defquit_(): '''asks the user if he wants to quit''' iftkMessageBox.askyesno ('Quit?','Do you want to quit?'): g.destroy() # this actually quits the GUI
Reverse text • We create a button that will reverse all the words in the text
Reverse text • We create a button that will reverse all the words in the text
Reverse word defreverse_word(word): returnword[-1::-1].capitalize() • We used capitalize so that the words will look nice: January -> Yraunaj and not yraunaJ
Reverse text defreverse(): orig = textbox.text.get(0.0, END) new() # delete the current text for line inorig.split('\n'): for word inline.split(' '): textbox.text.insert(END, reverse_word(word)) textbox.text.insert(END, ' ') # ‘ ‘ is a space textbox.text.insert(END, '\n') # newline
Reverse button g.bu(text='Reverse', command=reverse) • Add functionality, then add a button • We can now add other functionalities (if time permits): • Count words • Count characters (frequency counter) • Count lines • Decipher (HW 5) • Markov analysis (HW 4) • Translate (http://www.catonmat.net/blog/python-library-for-google-translate/)