From f55afae3c6999779a75af6236f947a663af9db65 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 12 Aug 1997 18:21:21 +0000 Subject: [PATCH] New dialog from Fred Lundh --- Lib/lib-tk/tkSimpleDialog.py | 212 ++++++++++++++++++++++++++++++++++ Lib/tkinter/tkSimpleDialog.py | 212 ++++++++++++++++++++++++++++++++++ 2 files changed, 424 insertions(+) create mode 100644 Lib/lib-tk/tkSimpleDialog.py create mode 100644 Lib/tkinter/tkSimpleDialog.py diff --git a/Lib/lib-tk/tkSimpleDialog.py b/Lib/lib-tk/tkSimpleDialog.py new file mode 100644 index 00000000000..68f414ae680 --- /dev/null +++ b/Lib/lib-tk/tkSimpleDialog.py @@ -0,0 +1,212 @@ +# +# An Introduction to Tkinter +# tkSimpleDialog.py +# +# Copyright (c) 1997 by Fredrik Lundh +# +# fredrik@pythonware.com +# http://www.pythonware.com +# + +# -------------------------------------------------------------------- +# dialog base class + +from Tkinter import * +import os + +class Dialog(Toplevel): + + def __init__(self, parent, title = None): + + Toplevel.__init__(self, parent) + self.transient(parent) + + if title: + self.title(title) + + self.parent = parent + + self.result = None + + body = Frame(self) + self.initial_focus = self.body(body) + body.pack(padx=5, pady=5) + + self.buttonbox() + + self.grab_set() + + if not self.initial_focus: + self.initial_focus = self + + self.protocol("WM_DELETE_WINDOW", self.cancel) + + self.geometry("+%d+%d" % (parent.winfo_rootx()+50, + parent.winfo_rooty()+50)) + + self.initial_focus.focus_set() + + self.wait_window(self) + + # + # construction hooks + + def body(self, master): + # create dialog body. return widget that should have + # initial focus. this method should be overridden + + pass + + def buttonbox(self): + # add standard button box. override if you don't want the + # standard buttons + + box = Frame(self) + + w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE) + w.pack(side=LEFT, padx=5, pady=5) + w = Button(box, text="Cancel", width=10, command=self.cancel) + w.pack(side=LEFT, padx=5, pady=5) + + self.bind("", self.ok) + self.bind("", self.cancel) + + box.pack() + + # + # standard button semantics + + def ok(self, event=None): + + if not self.validate(): + self.initial_focus.focus_set() # put focus back + return + + self.withdraw() + self.update_idletasks() + + self.apply() + + self.cancel() + + def cancel(self, event=None): + + # put focus back to the parent window + self.parent.focus_set() + self.destroy() + + # + # command hooks + + def validate(self): + + return 1 # override + + def apply(self): + + pass # override + + +# -------------------------------------------------------------------- +# convenience dialogues + +import string + +class _QueryDialog(Dialog): + + def __init__(self, title, prompt, + minvalue = None, maxvalue = None, + parent = None): + + from Tkinter import _default_root + + if not parent: + parent = _default_root + + self.prompt = prompt + self.minvalue = minvalue + self.maxvalue = maxvalue + + Dialog.__init__(self, parent, title) + + def body(self, master): + + w = Label(master, text=self.prompt) + w.grid(row=0, padx=5, sticky=W) + + self.entry = Entry(master, name="entry") + self.entry.grid(row=1, padx=5, sticky=W+E) + + return self.entry + + def validate(self): + + import tkMessageBox + + try: + result = self.getresult() + except ValueError: + tkMessageBox.showwarning( + "Bad value", + self.errormessage + "\nPlease try again", + parent = self + ) + return 0 + + if self.minvalue is not None and result < self.minvalue: + tkMessageBox.showwarning( + "Too small", + "The allowed minimum value is %s. " + "Please try again" % self.minvalue, + parent = self + ) + return 0 + + if self.maxvalue is not None and result > self.maxvalue: + tkMessageBox.showwarning( + "Bad value", + "The allowed maximum value is %s. " + "Please try again" % self.maxvalue, + parent = self + ) + return 0 + + self.result = result + + return 1 + + +class _QueryInteger(_QueryDialog): + errormessage = "Invalid integer" + def getresult(self): + return string.atoi(self.entry.get()) + +def askinteger(title, prompt, **kw): + d = apply(_QueryInteger, (title, prompt), kw) + return d.result + +class _QueryFloat(_QueryDialog): + errormessage = "Invalid floating point value" + def getresult(self): + return string.atof(self.entry.get()) + +def askfloat(title, prompt, **kw): + d = apply(_QueryFloat, (title, prompt), kw) + return d.result + +class _QueryString(_QueryDialog): + def getresult(self): + return self.entry.get() + +def askstring(title, prompt, **kw): + d = apply(_QueryString, (title, prompt), kw) + return d.result + +if __name__ == "__main__": + + root = Tk() + root.update() + + print askinteger("Spam", "Egg count") + print askfloat("Spam", "Egg weight") + print askstring("Spam", "Egg label") diff --git a/Lib/tkinter/tkSimpleDialog.py b/Lib/tkinter/tkSimpleDialog.py new file mode 100644 index 00000000000..68f414ae680 --- /dev/null +++ b/Lib/tkinter/tkSimpleDialog.py @@ -0,0 +1,212 @@ +# +# An Introduction to Tkinter +# tkSimpleDialog.py +# +# Copyright (c) 1997 by Fredrik Lundh +# +# fredrik@pythonware.com +# http://www.pythonware.com +# + +# -------------------------------------------------------------------- +# dialog base class + +from Tkinter import * +import os + +class Dialog(Toplevel): + + def __init__(self, parent, title = None): + + Toplevel.__init__(self, parent) + self.transient(parent) + + if title: + self.title(title) + + self.parent = parent + + self.result = None + + body = Frame(self) + self.initial_focus = self.body(body) + body.pack(padx=5, pady=5) + + self.buttonbox() + + self.grab_set() + + if not self.initial_focus: + self.initial_focus = self + + self.protocol("WM_DELETE_WINDOW", self.cancel) + + self.geometry("+%d+%d" % (parent.winfo_rootx()+50, + parent.winfo_rooty()+50)) + + self.initial_focus.focus_set() + + self.wait_window(self) + + # + # construction hooks + + def body(self, master): + # create dialog body. return widget that should have + # initial focus. this method should be overridden + + pass + + def buttonbox(self): + # add standard button box. override if you don't want the + # standard buttons + + box = Frame(self) + + w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE) + w.pack(side=LEFT, padx=5, pady=5) + w = Button(box, text="Cancel", width=10, command=self.cancel) + w.pack(side=LEFT, padx=5, pady=5) + + self.bind("", self.ok) + self.bind("", self.cancel) + + box.pack() + + # + # standard button semantics + + def ok(self, event=None): + + if not self.validate(): + self.initial_focus.focus_set() # put focus back + return + + self.withdraw() + self.update_idletasks() + + self.apply() + + self.cancel() + + def cancel(self, event=None): + + # put focus back to the parent window + self.parent.focus_set() + self.destroy() + + # + # command hooks + + def validate(self): + + return 1 # override + + def apply(self): + + pass # override + + +# -------------------------------------------------------------------- +# convenience dialogues + +import string + +class _QueryDialog(Dialog): + + def __init__(self, title, prompt, + minvalue = None, maxvalue = None, + parent = None): + + from Tkinter import _default_root + + if not parent: + parent = _default_root + + self.prompt = prompt + self.minvalue = minvalue + self.maxvalue = maxvalue + + Dialog.__init__(self, parent, title) + + def body(self, master): + + w = Label(master, text=self.prompt) + w.grid(row=0, padx=5, sticky=W) + + self.entry = Entry(master, name="entry") + self.entry.grid(row=1, padx=5, sticky=W+E) + + return self.entry + + def validate(self): + + import tkMessageBox + + try: + result = self.getresult() + except ValueError: + tkMessageBox.showwarning( + "Bad value", + self.errormessage + "\nPlease try again", + parent = self + ) + return 0 + + if self.minvalue is not None and result < self.minvalue: + tkMessageBox.showwarning( + "Too small", + "The allowed minimum value is %s. " + "Please try again" % self.minvalue, + parent = self + ) + return 0 + + if self.maxvalue is not None and result > self.maxvalue: + tkMessageBox.showwarning( + "Bad value", + "The allowed maximum value is %s. " + "Please try again" % self.maxvalue, + parent = self + ) + return 0 + + self.result = result + + return 1 + + +class _QueryInteger(_QueryDialog): + errormessage = "Invalid integer" + def getresult(self): + return string.atoi(self.entry.get()) + +def askinteger(title, prompt, **kw): + d = apply(_QueryInteger, (title, prompt), kw) + return d.result + +class _QueryFloat(_QueryDialog): + errormessage = "Invalid floating point value" + def getresult(self): + return string.atof(self.entry.get()) + +def askfloat(title, prompt, **kw): + d = apply(_QueryFloat, (title, prompt), kw) + return d.result + +class _QueryString(_QueryDialog): + def getresult(self): + return self.entry.get() + +def askstring(title, prompt, **kw): + d = apply(_QueryString, (title, prompt), kw) + return d.result + +if __name__ == "__main__": + + root = Tk() + root.update() + + print askinteger("Spam", "Egg count") + print askfloat("Spam", "Egg weight") + print askstring("Spam", "Egg label")