Added 'description' class attribute to every command class (to help the
[python/dscho.git] / Demo / tkinter / guido / dialog.py
blob1f794ae22a8738c447c8ee6f0374ce4afa7d786c
1 #! /usr/bin/env python
3 # A Python function that generates dialog boxes with a text message,
4 # optional bitmap, and any number of buttons.
5 # Cf. Ousterhout, Tcl and the Tk Toolkit, Figs. 27.2-3, pp. 269-270.
7 from Tkinter import *
8 import sys
11 def dialog(master, title, text, bitmap, default, *args):
13 # 1. Create the top-level window and divide it into top
14 # and bottom parts.
16 w = Toplevel(master, class_='Dialog')
17 w.title(title)
18 w.iconname('Dialog')
20 top = Frame(w, relief=RAISED, borderwidth=1)
21 top.pack(side=TOP, fill=BOTH)
22 bot = Frame(w, relief=RAISED, borderwidth=1)
23 bot.pack(side=BOTTOM, fill=BOTH)
25 # 2. Fill the top part with the bitmap and message.
27 msg = Message(top, width='3i', text=text,
28 font='-Adobe-Times-Medium-R-Normal-*-180-*')
29 msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m')
30 if bitmap:
31 bm = Label(top, bitmap=bitmap)
32 bm.pack(side=LEFT, padx='3m', pady='3m')
34 # 3. Create a row of buttons at the bottom of the dialog.
36 var = IntVar()
37 buttons = []
38 i = 0
39 for but in args:
40 b = Button(bot, text=but, command=lambda v=var,i=i: v.set(i))
41 buttons.append(b)
42 if i == default:
43 bd = Frame(bot, relief=SUNKEN, borderwidth=1)
44 bd.pack(side=LEFT, expand=1, padx='3m', pady='2m')
45 b.lift()
46 b.pack (in_=bd, side=LEFT,
47 padx='2m', pady='2m', ipadx='2m', ipady='1m')
48 else:
49 b.pack (side=LEFT, expand=1,
50 padx='3m', pady='3m', ipadx='2m', ipady='1m')
51 i = i+1
53 # 4. Set up a binding for <Return>, if there's a default,
54 # set a grab, and claim the focus too.
56 if default >= 0:
57 w.bind('<Return>',
58 lambda e, b=buttons[default], v=var, i=default:
59 (b.flash(),
60 v.set(i)))
62 oldFocus = w.focus_get()
63 w.grab_set()
64 w.focus_set()
66 # 5. Wait for the user to respond, then restore the focus
67 # and return the index of the selected button.
69 w.waitvar(var)
70 w.destroy()
71 if oldFocus: oldFocus.focus_set()
72 return var.get()
74 # The rest is the test program.
76 def go():
77 i = dialog(mainWidget,
78 'Not Responding',
79 "The file server isn't responding right now; "
80 "I'll keep trying.",
81 '',
82 -1,
83 'OK')
84 print 'pressed button', i
85 i = dialog(mainWidget,
86 'File Modified',
87 'File "tcl.h" has been modified since '
88 'the last time it was saved. '
89 'Do you want to save it before exiting the application?',
90 'warning',
92 'Save File',
93 'Discard Changes',
94 'Return To Editor')
95 print 'pressed button', i
97 def test():
98 import sys
99 global mainWidget
100 mainWidget = Frame()
101 Pack.config(mainWidget)
102 start = Button(mainWidget, text='Press Here To Start', command=go)
103 start.pack()
104 endit = Button(mainWidget, text="Exit", command=sys.exit)
105 endit.pack(fill=BOTH)
106 mainWidget.mainloop()
108 if __name__ == '__main__':
109 test()