mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	 05e8be17fd
			
		
	
	
		05e8be17fd
		
	
	
	
	
		
			
			svn+ssh://pythondev@svn.python.org/python/trunk ........ r60990 | eric.smith | 2008-02-23 17:05:26 +0100 (Sat, 23 Feb 2008) | 1 line Removed duplicate Py_CHARMASK define. It's already defined in Python.h. ........ r60991 | andrew.kuchling | 2008-02-23 17:23:05 +0100 (Sat, 23 Feb 2008) | 4 lines #1330538: Improve comparison of xmlrpclib.DateTime and datetime instances. Remove automatic handling of datetime.date and datetime.time. This breaks backward compatibility, but python-dev discussion was strongly against this automatic conversion; see the bug for a link. ........ r60994 | andrew.kuchling | 2008-02-23 17:39:43 +0100 (Sat, 23 Feb 2008) | 1 line #835521: Add index entries for various pickle-protocol methods and attributes ........ r60995 | andrew.kuchling | 2008-02-23 18:10:46 +0100 (Sat, 23 Feb 2008) | 2 lines #1433694: minidom's .normalize() failed to set .nextSibling for last element. Fix by Malte Helmert ........ r61000 | christian.heimes | 2008-02-23 18:40:11 +0100 (Sat, 23 Feb 2008) | 1 line Patch #2167 from calvin: Remove unused imports ........ r61001 | christian.heimes | 2008-02-23 18:42:31 +0100 (Sat, 23 Feb 2008) | 1 line Patch #1957: syslogmodule: Release GIL when calling syslog(3) ........ r61002 | christian.heimes | 2008-02-23 18:52:07 +0100 (Sat, 23 Feb 2008) | 2 lines Issue #2051 and patch from Alexander Belopolsky: Permission for pyc and pyo files are inherited from the py file. ........
		
			
				
	
	
		
			234 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #! /usr/bin/env python
 | |
| 
 | |
| # 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 *
 | |
| 
 | |
| mainWidget = None
 | |
| 
 | |
| 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', 'bd': 1,
 | |
|                     Pack: {'side': 'top', 'fill': 'both'}})
 | |
|     bot = Frame(w, {'relief': 'raised', 'bd': 1,
 | |
|                     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-*',
 | |
|                    Pack: {'side': 'right', 'expand': 1,
 | |
|                           'fill': 'both',
 | |
|                           'padx': '3m', 'pady': '3m'}})
 | |
|     if bitmap:
 | |
|         bm = Label(top, {'bitmap': bitmap,
 | |
|                          Pack: {'side': 'left',
 | |
|                                 'padx': '3m', 'pady': '3m'}})
 | |
| 
 | |
|     # 3. Create a row of buttons at the bottom of the dialog.
 | |
| 
 | |
|     buttons = []
 | |
|     i = 0
 | |
|     for but in args:
 | |
|         b = Button(bot, {'text': but,
 | |
|                          'command': ('set', 'button', i)})
 | |
|         buttons.append(b)
 | |
|         if i == default:
 | |
|             bd = Frame(bot, {'relief': 'sunken', 'bd': 1,
 | |
|                              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',
 | |
|                      'ipady': '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], i=default:
 | |
|                (b.flash(),
 | |
|                 b.setvar('button', i)))
 | |
| 
 | |
|     oldFocus = w.tk.call('focus') # XXX
 | |
|     w.grab_set()
 | |
|     w.focus()
 | |
| 
 | |
|     # 5. Wait for the user to respond, then restore the focus
 | |
|     # and return the index of the selected button.
 | |
| 
 | |
|     w.waitvar('button')
 | |
|     w.destroy()
 | |
|     w.tk.call('focus', oldFocus) # XXX
 | |
|     return w.getint(w.getvar('button'))
 | |
| 
 | |
| def strdialog(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', 'bd': 1,
 | |
|                     Pack: {'side': 'top', 'fill': 'both'}})
 | |
|     if args:
 | |
|         bot = Frame(w, {'relief': 'raised', 'bd': 1,
 | |
|                     Pack: {'side': 'bottom', 'fill': 'both'}})
 | |
| 
 | |
|     # 2. Fill the top part with the bitmap, message and input field.
 | |
| 
 | |
|     if bitmap:
 | |
|         bm = Label(top, {'bitmap': bitmap,
 | |
|                          Pack: {'side': 'left',
 | |
|                                 'padx': '3m', 'pady': '3m'}})
 | |
| 
 | |
|     msg = Message(top,
 | |
|                   {'width': '3i',
 | |
|                    'text': text,
 | |
|                    'font': '-Adobe-Times-Medium-R-Normal-*-180-*',
 | |
|                    Pack: {'side': 'left',
 | |
|                           'fill': 'both',
 | |
|                           'padx': '3m', 'pady': '3m'}})
 | |
| 
 | |
|     field = Entry(top,
 | |
|                   {'relief':'sunken',
 | |
|                    Pack:{'side':'left',
 | |
|                          'fill':'x',
 | |
|                          'expand':1,
 | |
|                          'padx':'3m', 'pady':'3m'}})
 | |
|     # 3. Create a row of buttons at the bottom of the dialog.
 | |
| 
 | |
|     buttons = []
 | |
|     i = 0
 | |
|     for but in args:
 | |
|         b = Button(bot, {'text': but,
 | |
|                          'command': ('set', 'button', i)})
 | |
|         buttons.append(b)
 | |
|         if i == default:
 | |
|             bd = Frame(bot, {'relief': 'sunken', 'bd': 1,
 | |
|                              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',
 | |
|                      'ipady': '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 not args:
 | |
|         w.bind('<Return>', lambda arg, top=top: top.setvar('button', 0))
 | |
|         field.bind('<Return>', lambda arg, top=top: top.setvar('button', 0))
 | |
|     elif default >= 0:
 | |
|         w.bind('<Return>',
 | |
|                lambda e, b=buttons[default], i=default:
 | |
|                (b.flash(),
 | |
|                 b.setvar('button', i)))
 | |
|         field.bind('<Return>',
 | |
|                lambda e, b=buttons[default], i=default:
 | |
|                (b.flash(),
 | |
|                 b.setvar('button', i)))
 | |
| 
 | |
|     oldFocus = w.tk.call('focus') # XXX
 | |
|     w.grab_set()
 | |
|     field.focus()
 | |
| 
 | |
|     # 5. Wait for the user to respond, then restore the focus
 | |
|     # and return the index of the selected button.
 | |
| 
 | |
|     w.waitvar('button')
 | |
|     v = field.get()
 | |
|     w.destroy()
 | |
|     w.tk.call('focus', oldFocus) # XXX
 | |
|     if args:
 | |
|         return v, w.getint(w.getvar('button'))
 | |
|     else:
 | |
|         return v
 | |
| 
 | |
| def message(str):
 | |
|     i = dialog(mainWidget, 'Message', str, '', 0, 'OK')
 | |
| 
 | |
| def askyn(str):
 | |
|     i = dialog(mainWidget, 'Question', str, '', 0, 'No', 'Yes')
 | |
|     return i
 | |
| 
 | |
| def askync(str):
 | |
|     i = dialog(mainWidget, 'Question', str, '', 0, 'Cancel', 'No', 'Yes')
 | |
|     return i-1
 | |
| 
 | |
| def askstr(str):
 | |
|     i = strdialog(mainWidget, 'Question', str, '', 0)
 | |
|     return i
 | |
| 
 | |
| def askfile(str):       # XXXX For now...
 | |
|     i = strdialog(mainWidget, 'Question', str, '', 0)
 | |
|     return i
 | |
| 
 | |
| # 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)
 | |
|     print(message('Test of message'))
 | |
|     print(askyn('Test of yes/no'))
 | |
|     print(askync('Test of yes/no/cancel'))
 | |
|     print(askstr('Type a string:'))
 | |
|     print(strdialog(mainWidget, 'Question', 'Another string:', '',
 | |
|                   0, 'Save', 'Save as text'))
 | |
| 
 | |
| def _test():
 | |
|     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': 'exit',
 | |
|                     Pack: {'fill' : 'both'}})
 | |
|     mainWidget.mainloop()
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     _test()
 |