14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# An Introduction to Tkinter 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# tkSimpleDialog.py 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Copyright (c) 1997 by Fredrik Lundh 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# fredrik@pythonware.com 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# http://www.pythonware.com 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# -------------------------------------------------------------------- 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# dialog base class 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao'''Dialog boxes 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis module handles dialog boxes. It contains the following 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaopublic symbols: 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 194adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDialog -- a base class for dialogs 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaskinteger -- get an integer from the user 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaskfloat -- get a float from the user 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaskstring -- get a string from the user 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao''' 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom Tkinter import * 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Dialog(Toplevel): 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''Class to open dialogs. 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This class is intended as a base class for custom dialogs 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, parent, title = None): 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''Initialize a dialog. 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Arguments: 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent -- a parent window (the application window) 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao title -- the dialog title 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Toplevel.__init__(self, parent) 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.withdraw() # remain invisible for now 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # If the master is not viewable, don't 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # make the child transient, or else it 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # would be opened withdrawn 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if parent.winfo_viewable(): 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.transient(parent) 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if title: 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.title(title) 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.parent = parent 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.result = None 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao body = Frame(self) 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.initial_focus = self.body(body) 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao body.pack(padx=5, pady=5) 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buttonbox() 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self.initial_focus: 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.initial_focus = self 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.protocol("WM_DELETE_WINDOW", self.cancel) 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.parent is not None: 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.geometry("+%d+%d" % (parent.winfo_rootx()+50, 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent.winfo_rooty()+50)) 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.deiconify() # become visibile now 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.initial_focus.focus_set() 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # wait for window to appear on screen before calling grab_set 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.wait_visibility() 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.grab_set() 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.wait_window(self) 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def destroy(self): 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''Destroy the window''' 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.initial_focus = None 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Toplevel.destroy(self) 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # construction hooks 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def body(self, master): 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''create dialog body. 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return widget that should have initial focus. 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This method should be overridden, and is called 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao by the __init__ method. 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def buttonbox(self): 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''add standard button box. 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao override if you do not want the standard buttons 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao box = Frame(self) 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE) 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao w.pack(side=LEFT, padx=5, pady=5) 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao w = Button(box, text="Cancel", width=10, command=self.cancel) 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao w.pack(side=LEFT, padx=5, pady=5) 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.bind("<Return>", self.ok) 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.bind("<Escape>", self.cancel) 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao box.pack() 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # standard button semantics 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def ok(self, event=None): 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self.validate(): 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.initial_focus.focus_set() # put focus back 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.withdraw() 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.update_idletasks() 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.apply() 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.cancel() 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def cancel(self, event=None): 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # put focus back to the parent window 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.parent is not None: 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.parent.focus_set() 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.destroy() 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # command hooks 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def validate(self): 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''validate the data 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This method is called automatically to validate the data before the 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dialog is destroyed. By default, it always validates OK. 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 1 # override 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def apply(self): 1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''process the data 1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This method is called automatically to process the data, *after* 1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao the dialog is destroyed. By default, it does nothing. 1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass # override 1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# -------------------------------------------------------------------- 1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# convenience dialogues 1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryDialog(Dialog): 1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, title, prompt, 1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao initialvalue=None, 1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao minvalue = None, maxvalue = None, 1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent = None): 1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not parent: 1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import Tkinter 1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent = Tkinter._default_root 1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.prompt = prompt 1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.minvalue = minvalue 1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.maxvalue = maxvalue 1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.initialvalue = initialvalue 1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Dialog.__init__(self, parent, title) 1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def destroy(self): 1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.entry = None 1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Dialog.destroy(self) 1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def body(self, master): 1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao w = Label(master, text=self.prompt, justify=LEFT) 1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao w.grid(row=0, padx=5, sticky=W) 1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.entry = Entry(master, name="entry") 2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.entry.grid(row=1, padx=5, sticky=W+E) 2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.initialvalue is not None: 2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.entry.insert(0, self.initialvalue) 2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.entry.select_range(0, END) 2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.entry 2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def validate(self): 2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import tkMessageBox 2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao result = self.getresult() 2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except ValueError: 2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao tkMessageBox.showwarning( 2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "Illegal value", 2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.errormessage + "\nPlease try again", 2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent = self 2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ) 2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 0 2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.minvalue is not None and result < self.minvalue: 2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao tkMessageBox.showwarning( 2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "Too small", 2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "The allowed minimum value is %s. " 2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "Please try again." % self.minvalue, 2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent = self 2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ) 2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 0 2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.maxvalue is not None and result > self.maxvalue: 2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao tkMessageBox.showwarning( 2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "Too large", 2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "The allowed maximum value is %s. " 2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "Please try again." % self.maxvalue, 2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao parent = self 2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ) 2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 0 2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.result = result 2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 1 2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryInteger(_QueryDialog): 2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errormessage = "Not an integer." 2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def getresult(self): 2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return int(self.entry.get()) 2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef askinteger(title, prompt, **kw): 2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''get an integer from the user 2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Arguments: 2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao title -- the dialog title 2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao prompt -- the label text 2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao **kw -- see SimpleDialog class 2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return value is an integer 2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao d = _QueryInteger(title, prompt, **kw) 2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return d.result 2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryFloat(_QueryDialog): 2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errormessage = "Not a floating point value." 2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def getresult(self): 2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return float(self.entry.get()) 2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef askfloat(title, prompt, **kw): 2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''get a float from the user 2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Arguments: 2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao title -- the dialog title 2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao prompt -- the label text 2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao **kw -- see SimpleDialog class 2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return value is a float 2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao d = _QueryFloat(title, prompt, **kw) 2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return d.result 2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryString(_QueryDialog): 2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, *args, **kw): 2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if "show" in kw: 2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.__show = kw["show"] 2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del kw["show"] 2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.__show = None 2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _QueryDialog.__init__(self, *args, **kw) 2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def body(self, master): 2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao entry = _QueryDialog.body(self, master) 2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.__show is not None: 2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao entry.configure(show=self.__show) 2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return entry 2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def getresult(self): 3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.entry.get() 3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef askstring(title, prompt, **kw): 3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '''get a string from the user 3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Arguments: 3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao title -- the dialog title 3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao prompt -- the label text 3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao **kw -- see SimpleDialog class 3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return value is a string 3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ''' 3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao d = _QueryString(title, prompt, **kw) 3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return d.result 3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__": 3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao root = Tk() 3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao root.update() 3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao print askinteger("Spam", "Egg count", initialvalue=12*12) 3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao print askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100) 3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao print askstring("Spam", "Egg label") 324