Presentation is loading. Please wait.

Presentation is loading. Please wait.

Computing Science 1P Lecture 17: Friday 23 rd February Simon Gay Department of Computing Science University of Glasgow 2006/07.

Similar presentations


Presentation on theme: "Computing Science 1P Lecture 17: Friday 23 rd February Simon Gay Department of Computing Science University of Glasgow 2006/07."— Presentation transcript:

1 Computing Science 1P Lecture 17: Friday 23 rd February Simon Gay Department of Computing Science University of Glasgow 2006/07

2 Computing Science 1P Lecture 17 - Simon Gay2 Graphical User Interfaces The key ideas of graphical user interfaces (on-screen windows, icons, menus, buttons etc, and a pointing device (mouse)) were developed at Xerox PARC during the late 1970s. These ideas were adopted by Apple, first in the Lisa (1983) and then in the popular Macintosh (1984). In 1985, Microsoft introduced Windows, first as an application and later as an operating system. Python makes it very easy to implement simple GUIs, so we will look at the main points.

3 2006/07Computing Science 1P Lecture 17 - Simon Gay3 The main ideas Some of the programs we have written have almost no user interface, or at least take no input from the user. For example, the GPA program (lecture 15). There is just a sequence of statements, carrying out the computation. We have also seen programs with a simple text-based menu interface. For example, the birthday book program (Unit 12). The structure of the program is a loop, prompting the user for a command and then calling a function in order to carry it out. GUI programs have a similar structure, except that the main loop is provided by a module, and the functions doing the work are called in response to mouse clicks on buttons, etc.

4 2006/07Computing Science 1P Lecture 17 - Simon Gay4 Where to find more information We will be using the Tkinter module for GUI programming. It is not covered in the course textbook. It will be in the exam. Many other Python books cover GUI programming with Tkinter, although they tend to make the simple examples more complicated than they need to be. A useful reference can be found at although again, its examples are over-complicated. http://infohost.nmt.edu/tcc/help/pubs/tkinter/tkinter.pdf Other links: http://wiki.python.org/moin/TkInter

5 2006/07Computing Science 1P Lecture 17 - Simon Gay5 The simplest GUI program in Python # Use the Tkinter module import Tkinter # Create the top-level (or root) window top = Tkinter.Tk() # Create a button... quitButton = Tkinter.Button(top,text="Quit", command=top.destroy) #... and display it in the window quitButton.grid() # Start the main loop: responds to the mouse etc Tkinter.mainloop() example1

6 2006/07Computing Science 1P Lecture 17 - Simon Gay6 Line by line top = Tkinter.Tk() This must be present in order to create a window. You always need at least one window to put buttons etc. in.

7 2006/07Computing Science 1P Lecture 17 - Simon Gay7 Line by line quitButton = Tkinter.Button(top,text="Quit", command=top.destroy) this must be present, to associate the button with the root window optional specifies a callback to be used when the button is pressed

8 2006/07Computing Science 1P Lecture 17 - Simon Gay8 Line by line quitButton.grid() This uses the layout manager called grid to place the button in the root window. Without this line, the button will not be displayed.

9 2006/07Computing Science 1P Lecture 17 - Simon Gay9 Line by line Tkinter.mainloop() This starts the main loop, which tracks the mouse and works out when and where it has been pressed. Clicking the mouse on the Quit button causes the callback to be called: i.e. the method top.destroy is called, which terminates the root window. In some books you will see top.mainloop() instead; it doesn't matter.

10 2006/07Computing Science 1P Lecture 17 - Simon Gay10 Event-driven programming GUI applications use a style of programming called event-driven. Events are mouse movements, mouse clicks, key presses, and many higher-level events constructed from these. (For example, clicking the mouse while the pointer is over a button generates a button press event). Some events are handled completely within the main loop provided by Tkinter. (For example, mouse movements are used to update the position of the pointer on the screen; clicking the minimize button of the window has the usual effect.)

11 2006/07Computing Science 1P Lecture 17 - Simon Gay11 Event-driven programming Other events, usually higher-level events such as button presses, menu selections, typing in a text field, are handled in a way that involves the user's code. This is controlled by defining callbacks. Example: if we have a button, the event we are interested in is pressing it. When the button is created, the command parameter is used to specify which function to call when the button is pressed. quitButton = Tkinter.Button(top,text="Quit", command=top.destroy)

12 2006/07Computing Science 1P Lecture 17 - Simon Gay12 Extending the example First let's add something to enable us to display a message to the user. Tkinter provides Label for this purpose. import Tkinter top = Tkinter.Tk() messageLabel = Tkinter.Label(top,text="Hello World!") messageLabel.grid() quitButton = Tkinter.Button(top,text="Quit", command=top.destroy) quitButton.grid() Tkinter.mainloop() example2

13 2006/07Computing Science 1P Lecture 17 - Simon Gay13 Extending the example Instead of displaying the message immediately, let's add another button with a callback which will display the message. import Tkinter def display(): messageLabel.configure(text="Hello World!") top = Tkinter.Tk() messageLabel = Tkinter.Label(top,text="") messageLabel.grid() showButton = Tkinter.Button(top,text="Show",command=display) showButton.grid() quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid() Tkinter.mainloop() example3

14 2006/07Computing Science 1P Lecture 17 - Simon Gay14 Points to note import Tkinter def display(): messageLabel.configure(text="Hello World!") top = Tkinter.Tk() messageLabel = Tkinter.Label(top,text="") messageLabel.grid() showButton = Tkinter.Button(top,text="Show",command=display) showButton.grid() quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid() Tkinter.mainloop() no brackets definition before use

15 2006/07Computing Science 1P Lecture 17 - Simon Gay15 Terminology The generic term for a GUI element (button, menu, label, …) is a widget. Collins English Dictionary (1986): widget n. Informal. any small mechanism or device, the name of which is unknown or temporarily forgotten [C20: changed from GADGET ]

16 2006/07Computing Science 1P Lecture 17 - Simon Gay16 Changing the layout We can use optional arguments with the grid method to control how widgets are placed. import Tkinter def display(): messageLabel.configure(text="Hello World!") top = Tkinter.Tk() messageLabel = Tkinter.Label(top,text="",width=12) messageLabel.grid(row=0,column=0) showButton = Tkinter.Button(top,text="Show",command=display) showButton.grid(row=0,column=1) quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid(row=0,column=2) Tkinter.mainloop() example4

17 2006/07Computing Science 1P Lecture 17 - Simon Gay17 Getting input from the user import Tkinter def display(): name = textVar.get() messageLabel.configure(text="Hello "+name) top = Tkinter.Tk() textVar = Tkinter.StringVar("") textEntry = Tkinter.Entry(top,textvariable=textVar,width=12) textEntry.grid(row=0,column=0) messageLabel = Tkinter.Label(top,text="",width=12) messageLabel.grid(row=1,column=0) showButton = Tkinter.Button(top,text="Show",command=display) showButton.grid(row=1,column=1) quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid(row=1,column=2) Tkinter.mainloop() example5

18 2006/07Computing Science 1P Lecture 17 - Simon Gay18 Important idea The Entry widget allows the user to enter text, but it does not have storage for the text built in. We have to create a Tkinter.StringVar object and give it to the Entry object. We can then use the get method of the StringVar to obtain the text. This style of programming is also needed with several other Tkinter widgets. It must be a StringVar, not an ordinary string variable.

19 2006/07Computing Science 1P Lecture 17 - Simon Gay19 Another example: Radiobutton def display(): name = textVar.get() ch = choice.get() if ch == 1: message = "Hello "+name elif ch == 2: message = "Goodbye "+name else: message = "" messageLabel.configure(text=message) top = Tkinter.Tk() textVar = Tkinter.StringVar("") textEntry = Tkinter.Entry(top,textvariable=textVar,width=12) textEntry.grid(row=0,column=0) messageLabel = Tkinter.Label(top,text="",width=12) messageLabel.grid(row=1,column=0) choice = Tkinter.IntVar(0) helloButton = Tkinter.Radiobutton(top,text="Hello", variable=choice,value=1,command=display) helloButton.grid(row=1,column=1) goodbyeButton = Tkinter.Radiobutton(top,text="Goodbye", variable=choice,value=2,command=display) goodbyeButton.grid(row=1,column=2) quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid(row=1,column=3) Tkinter.mainloop() example6

20 2006/07Computing Science 1P Lecture 17 - Simon Gay20 Another example: Radiobutton def display(): name = textVar.get() ch = choice.get() if ch == 1: message = "Hello "+name elif ch == 2: message = "Goodbye "+name else: message = "" messageLabel.configure(text=message) top = Tkinter.Tk() textVar = Tkinter.StringVar("") textEntry = Tkinter.Entry(top,textvariable=textVar,width=12) textEntry.grid(row=0,column=0) messageLabel = Tkinter.Label(top,text="",width=12) messageLabel.grid(row=1,column=0) choice = Tkinter.IntVar(0) helloButton = Tkinter.Radiobutton(top,text="Hello", variable=choice,value=1,command=display) helloButton.grid(row=1,column=1) goodbyeButton = Tkinter.Radiobutton(top,text="Goodbye", variable=choice,value=2,command=display) goodbyeButton.grid(row=1,column=2) quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid(row=1,column=3) Tkinter.mainloop()

21 2006/07Computing Science 1P Lecture 17 - Simon Gay21 Another example: Radiobutton def display(): name = textVar.get() ch = choice.get() if ch == 1: message = "Hello "+name elif ch == 2: message = "Goodbye "+name else: message = "" messageLabel.configure(text=message) top = Tkinter.Tk() textVar = Tkinter.StringVar("") textEntry = Tkinter.Entry(top,textvariable=textVar,width=12) textEntry.grid(row=0,column=0) messageLabel = Tkinter.Label(top,text="",width=12) messageLabel.grid(row=1,column=0) choice = Tkinter.IntVar(0) helloButton = Tkinter.Radiobutton(top,text="Hello", variable=choice,value=1,command=display) helloButton.grid(row=1,column=1) goodbyeButton = Tkinter.Radiobutton(top,text="Goodbye", variable=choice,value=2,command=display) goodbyeButton.grid(row=1,column=2) quitButton = Tkinter.Button(top,text="Quit",command=top.destroy) quitButton.grid(row=1,column=3) Tkinter.mainloop()

22 2006/07Computing Science 1P Lecture 17 - Simon Gay22 What would you prefer me to do on Wednesdays? More short questions (you do more work) More long problem-solving examples A mixture of both


Download ppt "Computing Science 1P Lecture 17: Friday 23 rd February Simon Gay Department of Computing Science University of Glasgow 2006/07."

Similar presentations


Ads by Google