| 
									
										
										
										
											1996-11-27 19:52:01 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # A Python function that generates dialog boxes with a text message, | 
					
						
							|  |  |  | # optional bitmap, and any number of buttons. | 
					
						
							|  |  |  | # Cf. Ousterhout, Tcl and the Tk Toolkit, Figs. 27.2-3, pp. 269-270. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from Tkinter import * | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def dialog(master, title, text, bitmap, default, *args): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # 1. Create the top-level window and divide it into top | 
					
						
							|  |  |  |     # and bottom parts. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     w = Toplevel(master, class_='Dialog') | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     w.title(title) | 
					
						
							|  |  |  |     w.iconname('Dialog') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     top = Frame(w, relief=RAISED, borderwidth=1) | 
					
						
							|  |  |  |     top.pack(side=TOP, fill=BOTH) | 
					
						
							|  |  |  |     bot = Frame(w, relief=RAISED, borderwidth=1) | 
					
						
							|  |  |  |     bot.pack(side=BOTTOM, fill=BOTH) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # 2. Fill the top part with the bitmap and message. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     msg = Message(top, width='3i', text=text, | 
					
						
							|  |  |  | 		  font='-Adobe-Times-Medium-R-Normal-*-180-*') | 
					
						
							|  |  |  |     msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m') | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     if bitmap: | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	bm = Label(top, bitmap=bitmap) | 
					
						
							|  |  |  | 	bm.pack(side=LEFT, padx='3m', pady='3m') | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # 3. Create a row of buttons at the bottom of the dialog. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     var = IntVar() | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     buttons = [] | 
					
						
							|  |  |  |     i = 0 | 
					
						
							|  |  |  |     for but in args: | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	b = Button(bot, text=but, command=lambda v=var,i=i: v.set(i)) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 	buttons.append(b) | 
					
						
							|  |  |  | 	if i == default: | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	    bd = Frame(bot, relief=SUNKEN, borderwidth=1) | 
					
						
							|  |  |  | 	    bd.pack(side=LEFT, expand=1, padx='3m', pady='2m') | 
					
						
							| 
									
										
										
										
											1994-06-20 08:11:36 +00:00
										 |  |  | 	    b.lift() | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	    b.pack (in_=bd, side=LEFT, | 
					
						
							|  |  |  | 		    padx='2m', pady='2m', ipadx='2m', ipady='1m') | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 	else: | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	    b.pack (side=LEFT, expand=1, | 
					
						
							|  |  |  | 		    padx='3m', pady='3m', ipady='2m', ipady='1m') | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 	i = i+1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # 4. Set up a binding for <Return>, if there's a default, | 
					
						
							|  |  |  |     # set a grab, and claim the focus too. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if default >= 0: | 
					
						
							|  |  |  | 	w.bind('<Return>', | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	       lambda e, b=buttons[default], v=var, i=default: | 
					
						
							| 
									
										
										
										
											1994-06-20 08:11:36 +00:00
										 |  |  | 	       (b.flash(), | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		v.set(i))) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     oldFocus = w.focus_get() | 
					
						
							| 
									
										
										
										
											1994-06-20 08:11:36 +00:00
										 |  |  |     w.grab_set() | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     w.focus_set() | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # 5. Wait for the user to respond, then restore the focus | 
					
						
							|  |  |  |     # and return the index of the selected button. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     w.waitvar(var) | 
					
						
							| 
									
										
										
										
											1994-06-20 08:11:36 +00:00
										 |  |  |     w.destroy() | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     if oldFocus: oldFocus.focus_set() | 
					
						
							|  |  |  |     return var.get() | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # The rest is the test program. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def go(): | 
					
						
							|  |  |  |     i = dialog(mainWidget, | 
					
						
							|  |  |  | 	       'Not Responding', | 
					
						
							|  |  |  | 	       "The file server isn't responding right now; " | 
					
						
							|  |  |  | 	       "I'll keep trying.", | 
					
						
							|  |  |  | 	       '', | 
					
						
							|  |  |  | 	       -1, | 
					
						
							|  |  |  | 	       'OK') | 
					
						
							|  |  |  |     print 'pressed button', i | 
					
						
							|  |  |  |     i = dialog(mainWidget, | 
					
						
							|  |  |  | 	       'File Modified', | 
					
						
							|  |  |  | 	       'File "tcl.h" has been modified since ' | 
					
						
							|  |  |  | 	       'the last time it was saved. ' | 
					
						
							|  |  |  | 	       'Do you want to save it before exiting the application?', | 
					
						
							|  |  |  | 	       'warning', | 
					
						
							|  |  |  | 	       0, | 
					
						
							|  |  |  | 	       'Save File', | 
					
						
							|  |  |  | 	       'Discard Changes', | 
					
						
							|  |  |  | 	       'Return To Editor') | 
					
						
							|  |  |  |     print 'pressed button', i | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  |     import sys | 
					
						
							|  |  |  |     global mainWidget | 
					
						
							|  |  |  |     mainWidget = Frame() | 
					
						
							|  |  |  |     Pack.config(mainWidget) | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     start = Button(mainWidget, text='Press Here To Start', command=go) | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  |     start.pack() | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  |     endit = Button(mainWidget, text="Exit", command=sys.exit) | 
					
						
							|  |  |  |     endit.pack(fill=BOTH) | 
					
						
							| 
									
										
										
										
											1994-06-20 08:11:36 +00:00
										 |  |  |     mainWidget.mainloop() | 
					
						
							| 
									
										
										
										
											1994-06-20 07:49:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test() |