dialog.py 3.13 KB
Newer Older
1
#! /usr/bin/env python
Guido van Rossum's avatar
Guido van Rossum committed
2 3 4 5 6 7

# 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 *
8 9
import sys

Guido van Rossum's avatar
Guido van Rossum committed
10 11 12 13 14 15

def dialog(master, title, text, bitmap, default, *args):

    # 1. Create the top-level window and divide it into top
    # and bottom parts.

16
    w = Toplevel(master, class_='Dialog')
Guido van Rossum's avatar
Guido van Rossum committed
17 18 19
    w.title(title)
    w.iconname('Dialog')

20 21 22 23
    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)
Guido van Rossum's avatar
Guido van Rossum committed
24 25 26

    # 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')
Guido van Rossum's avatar
Guido van Rossum committed
30
    if bitmap:
31 32
        bm = Label(top, bitmap=bitmap)
        bm.pack(side=LEFT, padx='3m', pady='3m')
Guido van Rossum's avatar
Guido van Rossum committed
33 34 35

    # 3. Create a row of buttons at the bottom of the dialog.

36
    var = IntVar()
Guido van Rossum's avatar
Guido van Rossum committed
37 38 39
    buttons = []
    i = 0
    for but in args:
40 41 42 43 44 45 46 47 48 49 50 51
        b = Button(bot, text=but, command=lambda v=var,i=i: v.set(i))
        buttons.append(b)
        if i == default:
            bd = Frame(bot, relief=SUNKEN, borderwidth=1)
            bd.pack(side=LEFT, expand=1, padx='3m', pady='2m')
            b.lift()
            b.pack (in_=bd, side=LEFT,
                    padx='2m', pady='2m', ipadx='2m', ipady='1m')
        else:
            b.pack (side=LEFT, expand=1,
                    padx='3m', pady='3m', ipadx='2m', ipady='1m')
        i = i+1
Guido van Rossum's avatar
Guido van Rossum committed
52 53 54 55 56

    # 4. Set up a binding for <Return>, if there's a default,
    # set a grab, and claim the focus too.

    if default >= 0:
57 58 59 60
        w.bind('<Return>',
               lambda e, b=buttons[default], v=var, i=default:
               (b.flash(),
                v.set(i)))
Guido van Rossum's avatar
Guido van Rossum committed
61

62
    oldFocus = w.focus_get()
63
    w.grab_set()
64
    w.focus_set()
Guido van Rossum's avatar
Guido van Rossum committed
65 66 67 68

    # 5. Wait for the user to respond, then restore the focus
    # and return the index of the selected button.

69
    w.waitvar(var)
70
    w.destroy()
71 72
    if oldFocus: oldFocus.focus_set()
    return var.get()
Guido van Rossum's avatar
Guido van Rossum committed
73 74 75 76 77

# The rest is the test program.

def go():
    i = dialog(mainWidget,
78 79 80 81 82 83
               'Not Responding',
               "The file server isn't responding right now; "
               "I'll keep trying.",
               '',
               -1,
               'OK')
Guido van Rossum's avatar
Guido van Rossum committed
84 85
    print 'pressed button', i
    i = dialog(mainWidget,
86 87 88 89 90 91 92 93 94
               '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')
Guido van Rossum's avatar
Guido van Rossum committed
95 96 97 98 99 100 101
    print 'pressed button', i

def test():
    import sys
    global mainWidget
    mainWidget = Frame()
    Pack.config(mainWidget)
102
    start = Button(mainWidget, text='Press Here To Start', command=go)
Guido van Rossum's avatar
Guido van Rossum committed
103
    start.pack()
104 105
    endit = Button(mainWidget, text="Exit", command=sys.exit)
    endit.pack(fill=BOTH)
106
    mainWidget.mainloop()
Guido van Rossum's avatar
Guido van Rossum committed
107 108 109

if __name__ == '__main__':
    test()