mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#! /usr/bin/env python3
 | 
						|
 | 
						|
# 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 *
 | 
						|
import sys
 | 
						|
 | 
						|
 | 
						|
def dialog(master, title, text, bitmap, default, *args):
 | 
						|
 | 
						|
    # 1. Create the top-level window and divide it into top
 | 
						|
    # and bottom parts.
 | 
						|
 | 
						|
    w = Toplevel(master, class_='Dialog')
 | 
						|
    w.title(title)
 | 
						|
    w.iconname('Dialog')
 | 
						|
 | 
						|
    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)
 | 
						|
 | 
						|
    # 2. Fill the top part with the bitmap and message.
 | 
						|
 | 
						|
    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')
 | 
						|
    if bitmap:
 | 
						|
        bm = Label(top, bitmap=bitmap)
 | 
						|
        bm.pack(side=LEFT, padx='3m', pady='3m')
 | 
						|
 | 
						|
    # 3. Create a row of buttons at the bottom of the dialog.
 | 
						|
 | 
						|
    var = IntVar()
 | 
						|
    buttons = []
 | 
						|
    i = 0
 | 
						|
    for but in args:
 | 
						|
        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
 | 
						|
 | 
						|
    # 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>',
 | 
						|
               lambda e, b=buttons[default], v=var, i=default:
 | 
						|
               (b.flash(),
 | 
						|
                v.set(i)))
 | 
						|
 | 
						|
    oldFocus = w.focus_get()
 | 
						|
    w.grab_set()
 | 
						|
    w.focus_set()
 | 
						|
 | 
						|
    # 5. Wait for the user to respond, then restore the focus
 | 
						|
    # and return the index of the selected button.
 | 
						|
 | 
						|
    w.waitvar(var)
 | 
						|
    w.destroy()
 | 
						|
    if oldFocus: oldFocus.focus_set()
 | 
						|
    return var.get()
 | 
						|
 | 
						|
# 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)
 | 
						|
    start = Button(mainWidget, text='Press Here To Start', command=go)
 | 
						|
    start.pack()
 | 
						|
    endit = Button(mainWidget, text="Exit", command=sys.exit)
 | 
						|
    endit.pack(fill=BOTH)
 | 
						|
    mainWidget.mainloop()
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    test()
 |