blob: 1830d66cbb7c0251525ae312a07ee87dcf61be2a [file] [log] [blame]
Guido van Rossumf55afae1997-08-12 18:21:21 +00001#
2# An Introduction to Tkinter
3# tkSimpleDialog.py
4#
5# Copyright (c) 1997 by Fredrik Lundh
6#
7# fredrik@pythonware.com
8# http://www.pythonware.com
9#
10
11# --------------------------------------------------------------------
12# dialog base class
13
14from Tkinter import *
15import os
16
17class Dialog(Toplevel):
18
19 def __init__(self, parent, title = None):
20
21 Toplevel.__init__(self, parent)
22 self.transient(parent)
23
24 if title:
25 self.title(title)
26
27 self.parent = parent
28
29 self.result = None
30
31 body = Frame(self)
32 self.initial_focus = self.body(body)
33 body.pack(padx=5, pady=5)
34
35 self.buttonbox()
36
37 self.grab_set()
38
39 if not self.initial_focus:
40 self.initial_focus = self
41
42 self.protocol("WM_DELETE_WINDOW", self.cancel)
43
44 self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
45 parent.winfo_rooty()+50))
46
47 self.initial_focus.focus_set()
48
49 self.wait_window(self)
50
Guido van Rossum7ea8f841999-06-25 15:53:54 +000051 def destroy(self):
52 self.initial_focus = None
53 Toplevel.destroy(self)
54
Guido van Rossumf55afae1997-08-12 18:21:21 +000055 #
56 # construction hooks
57
58 def body(self, master):
59 # create dialog body. return widget that should have
60 # initial focus. this method should be overridden
61
62 pass
63
64 def buttonbox(self):
65 # add standard button box. override if you don't want the
66 # standard buttons
67
68 box = Frame(self)
69
70 w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
71 w.pack(side=LEFT, padx=5, pady=5)
72 w = Button(box, text="Cancel", width=10, command=self.cancel)
73 w.pack(side=LEFT, padx=5, pady=5)
74
75 self.bind("<Return>", self.ok)
76 self.bind("<Escape>", self.cancel)
77
78 box.pack()
79
80 #
81 # standard button semantics
82
83 def ok(self, event=None):
84
85 if not self.validate():
86 self.initial_focus.focus_set() # put focus back
87 return
88
89 self.withdraw()
90 self.update_idletasks()
91
92 self.apply()
93
94 self.cancel()
95
96 def cancel(self, event=None):
97
98 # put focus back to the parent window
99 self.parent.focus_set()
100 self.destroy()
101
102 #
103 # command hooks
104
105 def validate(self):
106
107 return 1 # override
108
109 def apply(self):
110
111 pass # override
112
113
114# --------------------------------------------------------------------
115# convenience dialogues
116
117import string
118
119class _QueryDialog(Dialog):
120
121 def __init__(self, title, prompt,
Guido van Rossum1530c871997-08-14 14:17:28 +0000122 initialvalue=None,
Guido van Rossumf55afae1997-08-12 18:21:21 +0000123 minvalue = None, maxvalue = None,
124 parent = None):
125
Guido van Rossumf55afae1997-08-12 18:21:21 +0000126 if not parent:
Guido van Rossum7f202631998-10-12 20:40:09 +0000127 import Tkinter
128 parent = Tkinter._default_root
Guido van Rossumf55afae1997-08-12 18:21:21 +0000129
130 self.prompt = prompt
131 self.minvalue = minvalue
132 self.maxvalue = maxvalue
133
Guido van Rossum1530c871997-08-14 14:17:28 +0000134 self.initialvalue = initialvalue
135
Guido van Rossumf55afae1997-08-12 18:21:21 +0000136 Dialog.__init__(self, parent, title)
137
Guido van Rossum7ea8f841999-06-25 15:53:54 +0000138 def destroy(self):
139 self.entry = None
140 Dialog.destroy(self)
141
Guido van Rossumf55afae1997-08-12 18:21:21 +0000142 def body(self, master):
143
Guido van Rossum1530c871997-08-14 14:17:28 +0000144 w = Label(master, text=self.prompt, justify=LEFT)
Guido van Rossumf55afae1997-08-12 18:21:21 +0000145 w.grid(row=0, padx=5, sticky=W)
146
147 self.entry = Entry(master, name="entry")
148 self.entry.grid(row=1, padx=5, sticky=W+E)
149
Guido van Rossum1530c871997-08-14 14:17:28 +0000150 if self.initialvalue:
151 self.entry.insert(0, self.initialvalue)
152 self.entry.select_range(0, END)
153
Guido van Rossumf55afae1997-08-12 18:21:21 +0000154 return self.entry
155
156 def validate(self):
157
158 import tkMessageBox
159
160 try:
161 result = self.getresult()
162 except ValueError:
163 tkMessageBox.showwarning(
Guido van Rossum1530c871997-08-14 14:17:28 +0000164 "Illegal value",
Guido van Rossumf55afae1997-08-12 18:21:21 +0000165 self.errormessage + "\nPlease try again",
166 parent = self
167 )
168 return 0
169
170 if self.minvalue is not None and result < self.minvalue:
171 tkMessageBox.showwarning(
172 "Too small",
173 "The allowed minimum value is %s. "
Guido van Rossum1530c871997-08-14 14:17:28 +0000174 "Please try again." % self.minvalue,
Guido van Rossumf55afae1997-08-12 18:21:21 +0000175 parent = self
176 )
177 return 0
178
179 if self.maxvalue is not None and result > self.maxvalue:
180 tkMessageBox.showwarning(
Guido van Rossum1530c871997-08-14 14:17:28 +0000181 "Too large",
Guido van Rossumf55afae1997-08-12 18:21:21 +0000182 "The allowed maximum value is %s. "
Guido van Rossum1530c871997-08-14 14:17:28 +0000183 "Please try again." % self.maxvalue,
Guido van Rossumf55afae1997-08-12 18:21:21 +0000184 parent = self
185 )
186 return 0
187
188 self.result = result
189
190 return 1
191
192
193class _QueryInteger(_QueryDialog):
Guido van Rossum1530c871997-08-14 14:17:28 +0000194 errormessage = "Not an integer."
Guido van Rossumf55afae1997-08-12 18:21:21 +0000195 def getresult(self):
196 return string.atoi(self.entry.get())
197
198def askinteger(title, prompt, **kw):
199 d = apply(_QueryInteger, (title, prompt), kw)
200 return d.result
201
202class _QueryFloat(_QueryDialog):
Guido van Rossum1530c871997-08-14 14:17:28 +0000203 errormessage = "Not a floating point value."
Guido van Rossumf55afae1997-08-12 18:21:21 +0000204 def getresult(self):
205 return string.atof(self.entry.get())
206
207def askfloat(title, prompt, **kw):
208 d = apply(_QueryFloat, (title, prompt), kw)
209 return d.result
210
211class _QueryString(_QueryDialog):
212 def getresult(self):
213 return self.entry.get()
214
215def askstring(title, prompt, **kw):
216 d = apply(_QueryString, (title, prompt), kw)
217 return d.result
218
219if __name__ == "__main__":
220
221 root = Tk()
222 root.update()
223
Guido van Rossum1530c871997-08-14 14:17:28 +0000224 print askinteger("Spam", "Egg count", initialvalue=12*12)
225 print askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100)
Guido van Rossumf55afae1997-08-12 18:21:21 +0000226 print askstring("Spam", "Egg label")
Guido van Rossum1530c871997-08-14 14:17:28 +0000227