ยปCore Development>Code coverage>Lib/lib-tk/tkSimpleDialog.py

Python code coverage for Lib/lib-tk/tkSimpleDialog.py

#countcontent
1n/a#
2n/a# An Introduction to Tkinter
3n/a# tkSimpleDialog.py
4n/a#
5n/a# Copyright (c) 1997 by Fredrik Lundh
6n/a#
7n/a# fredrik@pythonware.com
8n/a# http://www.pythonware.com
9n/a#
10n/a
11n/a# --------------------------------------------------------------------
12n/a# dialog base class
13n/a
14n/a'''Dialog boxes
15n/a
16n/aThis module handles dialog boxes. It contains the following
17n/apublic symbols:
18n/a
19n/aDialog -- a base class for dialogs
20n/a
21n/aaskinteger -- get an integer from the user
22n/a
23n/aaskfloat -- get a float from the user
24n/a
25n/aaskstring -- get a string from the user
26n/a'''
27n/a
28n/afrom Tkinter import *
29n/a
30n/aclass Dialog(Toplevel):
31n/a
32n/a '''Class to open dialogs.
33n/a
34n/a This class is intended as a base class for custom dialogs
35n/a '''
36n/a
37n/a def __init__(self, parent, title = None):
38n/a
39n/a '''Initialize a dialog.
40n/a
41n/a Arguments:
42n/a
43n/a parent -- a parent window (the application window)
44n/a
45n/a title -- the dialog title
46n/a '''
47n/a Toplevel.__init__(self, parent)
48n/a
49n/a self.withdraw() # remain invisible for now
50n/a # If the master is not viewable, don't
51n/a # make the child transient, or else it
52n/a # would be opened withdrawn
53n/a if parent.winfo_viewable():
54n/a self.transient(parent)
55n/a
56n/a if title:
57n/a self.title(title)
58n/a
59n/a self.parent = parent
60n/a
61n/a self.result = None
62n/a
63n/a body = Frame(self)
64n/a self.initial_focus = self.body(body)
65n/a body.pack(padx=5, pady=5)
66n/a
67n/a self.buttonbox()
68n/a
69n/a
70n/a if not self.initial_focus:
71n/a self.initial_focus = self
72n/a
73n/a self.protocol("WM_DELETE_WINDOW", self.cancel)
74n/a
75n/a if self.parent is not None:
76n/a self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
77n/a parent.winfo_rooty()+50))
78n/a
79n/a self.deiconify() # become visibile now
80n/a
81n/a self.initial_focus.focus_set()
82n/a
83n/a # wait for window to appear on screen before calling grab_set
84n/a self.wait_visibility()
85n/a self.grab_set()
86n/a self.wait_window(self)
87n/a
88n/a def destroy(self):
89n/a '''Destroy the window'''
90n/a self.initial_focus = None
91n/a Toplevel.destroy(self)
92n/a
93n/a #
94n/a # construction hooks
95n/a
96n/a def body(self, master):
97n/a '''create dialog body.
98n/a
99n/a return widget that should have initial focus.
100n/a This method should be overridden, and is called
101n/a by the __init__ method.
102n/a '''
103n/a pass
104n/a
105n/a def buttonbox(self):
106n/a '''add standard button box.
107n/a
108n/a override if you do not want the standard buttons
109n/a '''
110n/a
111n/a box = Frame(self)
112n/a
113n/a w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
114n/a w.pack(side=LEFT, padx=5, pady=5)
115n/a w = Button(box, text="Cancel", width=10, command=self.cancel)
116n/a w.pack(side=LEFT, padx=5, pady=5)
117n/a
118n/a self.bind("<Return>", self.ok)
119n/a self.bind("<Escape>", self.cancel)
120n/a
121n/a box.pack()
122n/a
123n/a #
124n/a # standard button semantics
125n/a
126n/a def ok(self, event=None):
127n/a
128n/a if not self.validate():
129n/a self.initial_focus.focus_set() # put focus back
130n/a return
131n/a
132n/a self.withdraw()
133n/a self.update_idletasks()
134n/a
135n/a try:
136n/a self.apply()
137n/a finally:
138n/a self.cancel()
139n/a
140n/a def cancel(self, event=None):
141n/a
142n/a # put focus back to the parent window
143n/a if self.parent is not None:
144n/a self.parent.focus_set()
145n/a self.destroy()
146n/a
147n/a #
148n/a # command hooks
149n/a
150n/a def validate(self):
151n/a '''validate the data
152n/a
153n/a This method is called automatically to validate the data before the
154n/a dialog is destroyed. By default, it always validates OK.
155n/a '''
156n/a
157n/a return 1 # override
158n/a
159n/a def apply(self):
160n/a '''process the data
161n/a
162n/a This method is called automatically to process the data, *after*
163n/a the dialog is destroyed. By default, it does nothing.
164n/a '''
165n/a
166n/a pass # override
167n/a
168n/a
169n/a# --------------------------------------------------------------------
170n/a# convenience dialogues
171n/a
172n/aclass _QueryDialog(Dialog):
173n/a
174n/a def __init__(self, title, prompt,
175n/a initialvalue=None,
176n/a minvalue = None, maxvalue = None,
177n/a parent = None):
178n/a
179n/a if not parent:
180n/a import Tkinter
181n/a parent = Tkinter._default_root
182n/a
183n/a self.prompt = prompt
184n/a self.minvalue = minvalue
185n/a self.maxvalue = maxvalue
186n/a
187n/a self.initialvalue = initialvalue
188n/a
189n/a Dialog.__init__(self, parent, title)
190n/a
191n/a def destroy(self):
192n/a self.entry = None
193n/a Dialog.destroy(self)
194n/a
195n/a def body(self, master):
196n/a
197n/a w = Label(master, text=self.prompt, justify=LEFT)
198n/a w.grid(row=0, padx=5, sticky=W)
199n/a
200n/a self.entry = Entry(master, name="entry")
201n/a self.entry.grid(row=1, padx=5, sticky=W+E)
202n/a
203n/a if self.initialvalue:
204n/a self.entry.insert(0, self.initialvalue)
205n/a self.entry.select_range(0, END)
206n/a
207n/a return self.entry
208n/a
209n/a def validate(self):
210n/a
211n/a import tkMessageBox
212n/a
213n/a try:
214n/a result = self.getresult()
215n/a except ValueError:
216n/a tkMessageBox.showwarning(
217n/a "Illegal value",
218n/a self.errormessage + "\nPlease try again",
219n/a parent = self
220n/a )
221n/a return 0
222n/a
223n/a if self.minvalue is not None and result < self.minvalue:
224n/a tkMessageBox.showwarning(
225n/a "Too small",
226n/a "The allowed minimum value is %s. "
227n/a "Please try again." % self.minvalue,
228n/a parent = self
229n/a )
230n/a return 0
231n/a
232n/a if self.maxvalue is not None and result > self.maxvalue:
233n/a tkMessageBox.showwarning(
234n/a "Too large",
235n/a "The allowed maximum value is %s. "
236n/a "Please try again." % self.maxvalue,
237n/a parent = self
238n/a )
239n/a return 0
240n/a
241n/a self.result = result
242n/a
243n/a return 1
244n/a
245n/a
246n/aclass _QueryInteger(_QueryDialog):
247n/a errormessage = "Not an integer."
248n/a def getresult(self):
249n/a return int(self.entry.get())
250n/a
251n/adef askinteger(title, prompt, **kw):
252n/a '''get an integer from the user
253n/a
254n/a Arguments:
255n/a
256n/a title -- the dialog title
257n/a prompt -- the label text
258n/a **kw -- see SimpleDialog class
259n/a
260n/a Return value is an integer
261n/a '''
262n/a d = _QueryInteger(title, prompt, **kw)
263n/a return d.result
264n/a
265n/aclass _QueryFloat(_QueryDialog):
266n/a errormessage = "Not a floating point value."
267n/a def getresult(self):
268n/a return float(self.entry.get())
269n/a
270n/adef askfloat(title, prompt, **kw):
271n/a '''get a float from the user
272n/a
273n/a Arguments:
274n/a
275n/a title -- the dialog title
276n/a prompt -- the label text
277n/a **kw -- see SimpleDialog class
278n/a
279n/a Return value is a float
280n/a '''
281n/a d = _QueryFloat(title, prompt, **kw)
282n/a return d.result
283n/a
284n/aclass _QueryString(_QueryDialog):
285n/a def __init__(self, *args, **kw):
286n/a if "show" in kw:
287n/a self.__show = kw["show"]
288n/a del kw["show"]
289n/a else:
290n/a self.__show = None
291n/a _QueryDialog.__init__(self, *args, **kw)
292n/a
293n/a def body(self, master):
294n/a entry = _QueryDialog.body(self, master)
295n/a if self.__show is not None:
296n/a entry.configure(show=self.__show)
297n/a return entry
298n/a
299n/a def getresult(self):
300n/a return self.entry.get()
301n/a
302n/adef askstring(title, prompt, **kw):
303n/a '''get a string from the user
304n/a
305n/a Arguments:
306n/a
307n/a title -- the dialog title
308n/a prompt -- the label text
309n/a **kw -- see SimpleDialog class
310n/a
311n/a Return value is a string
312n/a '''
313n/a d = _QueryString(title, prompt, **kw)
314n/a return d.result
315n/a
316n/aif __name__ == "__main__":
317n/a
318n/a root = Tk()
319n/a root.update()
320n/a
321n/a print askinteger("Spam", "Egg count", initialvalue=12*12)
322n/a print askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100)
323n/a print askstring("Spam", "Egg label")