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
160 class _QueryDialog(Dialog
):
162 def __init__(self
, title
, prompt
,
164 minvalue
= None, maxvalue
= None,
169 parent
= Tkinter
._default
_root
172 self
.minvalue
= minvalue
173 self
.maxvalue
= maxvalue
175 self
.initialvalue
= initialvalue
177 Dialog
.__init
__(self
, parent
, title
)
183 def body(self
, master
):
185 w
= Label(master
, text
=self
.prompt
, justify
=LEFT
)
186 w
.grid(row
=0, padx
=5, sticky
=W
)
188 self
.entry
= Entry(master
, name
="entry")
189 self
.entry
.grid(row
=1, padx
=5, sticky
=W
+E
)
191 if self
.initialvalue
:
192 self
.entry
.insert(0, self
.initialvalue
)
193 self
.entry
.select_range(0, END
)
202 result
= self
.getresult()
204 tkMessageBox
.showwarning(
206 self
.errormessage
+ "\nPlease try again",
211 if self
.minvalue
is not None and result
< self
.minvalue
:
212 tkMessageBox
.showwarning(
214 "The allowed minimum value is %s. "
215 "Please try again." % self
.minvalue
,
220 if self
.maxvalue
is not None and result
> self
.maxvalue
:
221 tkMessageBox
.showwarning(
223 "The allowed maximum value is %s. "
224 "Please try again." % self
.maxvalue
,
234 class _QueryInteger(_QueryDialog
):
235 errormessage
= "Not an integer."
237 return int(self
.entry
.get())
239 def askinteger(title
, prompt
, **kw
):
240 '''get an integer from the user
244 title -- the dialog title
245 prompt -- the label text
246 **kw -- see SimpleDialog class
248 Return value is an integer
250 d
= apply(_QueryInteger
, (title
, prompt
), kw
)
253 class _QueryFloat(_QueryDialog
):
254 errormessage
= "Not a floating point value."
256 return float(self
.entry
.get())
258 def askfloat(title
, prompt
, **kw
):
259 '''get a float from the user
263 title -- the dialog title
264 prompt -- the label text
265 **kw -- see SimpleDialog class
267 Return value is a float
269 d
= apply(_QueryFloat
, (title
, prompt
), kw
)
272 class _QueryString(_QueryDialog
):
274 return self
.entry
.get()
276 def askstring(title
, prompt
, **kw
):
277 '''get a string from the user
281 title -- the dialog title
282 prompt -- the label text
283 **kw -- see SimpleDialog class
285 Return value is a string
287 d
= apply(_QueryString
, (title
, prompt
), kw
)
290 if __name__
== "__main__":
295 print askinteger("Spam", "Egg count", initialvalue
=12*12)
296 print askfloat("Spam", "Egg weight\n(in tons)", minvalue
=1, maxvalue
=100)
297 print askstring("Spam", "Egg label")