2 # An Introduction to Tkinter
5 # Copyright (c) 1997 by Fredrik Lundh
7 # fredrik@pythonware.com
8 # http://www.pythonware.com
11 # --------------------------------------------------------------------
16 This module handles dialog boxes. It contains the following
19 Dialog -- a base class for dialogs
21 askinteger -- get an integer from the user
23 askfloat -- get a float from the user
25 askstring -- get a string from the user
31 class Dialog(Toplevel
):
33 '''Class to open dialogs.
35 This class is intended as a base class for custom dialogs
38 def __init__(self
, parent
, title
= None):
40 '''Initialize a dialog.
44 parent -- a parent window (the application window)
46 title -- the dialog title
48 Toplevel
.__init
__(self
, parent
)
49 self
.transient(parent
)
59 self
.initial_focus
= self
.body(body
)
60 body
.pack(padx
=5, pady
=5)
66 if not self
.initial_focus
:
67 self
.initial_focus
= self
69 self
.protocol("WM_DELETE_WINDOW", self
.cancel
)
71 self
.geometry("+%d+%d" % (parent
.winfo_rootx()+50,
72 parent
.winfo_rooty()+50))
74 self
.initial_focus
.focus_set()
76 self
.wait_window(self
)
79 '''Destroy the window'''
80 self
.initial_focus
= None
81 Toplevel
.destroy(self
)
86 def body(self
, master
):
87 '''create dialog body.
89 return widget that should have initial focus.
90 This method should be overridden, and is called
91 by the __init__ method.
96 '''add standard button box.
98 override if you don't want the standard buttons
103 w
= Button(box
, text
="OK", width
=10, command
=self
.ok
, default
=ACTIVE
)
104 w
.pack(side
=LEFT
, padx
=5, pady
=5)
105 w
= Button(box
, text
="Cancel", width
=10, command
=self
.cancel
)
106 w
.pack(side
=LEFT
, padx
=5, pady
=5)
108 self
.bind("<Return>", self
.ok
)
109 self
.bind("<Escape>", self
.cancel
)
114 # standard button semantics
116 def ok(self
, event
=None):
118 if not self
.validate():
119 self
.initial_focus
.focus_set() # put focus back
123 self
.update_idletasks()
129 def cancel(self
, event
=None):
131 # put focus back to the parent window
132 self
.parent
.focus_set()
141 This method is called automatically to validate the data before the
142 dialog is destroyed. By default, it always validates OK.
150 This method is called automatically to process the data, *after*
151 the dialog is destroyed. By default, it does nothing.
157 # --------------------------------------------------------------------
158 # convenience dialogues
162 class _QueryDialog(Dialog
):
164 def __init__(self
, title
, prompt
,
166 minvalue
= None, maxvalue
= None,
171 parent
= Tkinter
._default
_root
174 self
.minvalue
= minvalue
175 self
.maxvalue
= maxvalue
177 self
.initialvalue
= initialvalue
179 Dialog
.__init
__(self
, parent
, title
)
185 def body(self
, master
):
187 w
= Label(master
, text
=self
.prompt
, justify
=LEFT
)
188 w
.grid(row
=0, padx
=5, sticky
=W
)
190 self
.entry
= Entry(master
, name
="entry")
191 self
.entry
.grid(row
=1, padx
=5, sticky
=W
+E
)
193 if self
.initialvalue
:
194 self
.entry
.insert(0, self
.initialvalue
)
195 self
.entry
.select_range(0, END
)
204 result
= self
.getresult()
206 tkMessageBox
.showwarning(
208 self
.errormessage
+ "\nPlease try again",
213 if self
.minvalue
is not None and result
< self
.minvalue
:
214 tkMessageBox
.showwarning(
216 "The allowed minimum value is %s. "
217 "Please try again." % self
.minvalue
,
222 if self
.maxvalue
is not None and result
> self
.maxvalue
:
223 tkMessageBox
.showwarning(
225 "The allowed maximum value is %s. "
226 "Please try again." % self
.maxvalue
,
236 class _QueryInteger(_QueryDialog
):
237 errormessage
= "Not an integer."
239 return string
.atoi(self
.entry
.get())
241 def askinteger(title
, prompt
, **kw
):
242 '''get an integer from the user
246 title -- the dialog title
247 prompt -- the label text
248 **kw -- see SimpleDialog class
250 Return value is an integer
252 d
= apply(_QueryInteger
, (title
, prompt
), kw
)
255 class _QueryFloat(_QueryDialog
):
256 errormessage
= "Not a floating point value."
258 return string
.atof(self
.entry
.get())
260 def askfloat(title
, prompt
, **kw
):
261 '''get a float from the user
265 title -- the dialog title
266 prompt -- the label text
267 **kw -- see SimpleDialog class
269 Return value is a float
271 d
= apply(_QueryFloat
, (title
, prompt
), kw
)
274 class _QueryString(_QueryDialog
):
276 return self
.entry
.get()
278 def askstring(title
, prompt
, **kw
):
279 '''get a string from the user
283 title -- the dialog title
284 prompt -- the label text
285 **kw -- see SimpleDialog class
287 Return value is a string
289 d
= apply(_QueryString
, (title
, prompt
), kw
)
292 if __name__
== "__main__":
297 print askinteger("Spam", "Egg count", initialvalue
=12*12)
298 print askfloat("Spam", "Egg weight\n(in tons)", minvalue
=1, maxvalue
=100)
299 print askstring("Spam", "Egg label")