17db96d56Sopenharmony_ci# 27db96d56Sopenharmony_ci# An Introduction to Tkinter 37db96d56Sopenharmony_ci# 47db96d56Sopenharmony_ci# Copyright (c) 1997 by Fredrik Lundh 57db96d56Sopenharmony_ci# 67db96d56Sopenharmony_ci# This copyright applies to Dialog, askinteger, askfloat and asktring 77db96d56Sopenharmony_ci# 87db96d56Sopenharmony_ci# fredrik@pythonware.com 97db96d56Sopenharmony_ci# http://www.pythonware.com 107db96d56Sopenharmony_ci# 117db96d56Sopenharmony_ci"""This modules handles dialog boxes. 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciIt contains the following public symbols: 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciSimpleDialog -- A simple but flexible modal dialog box 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ciDialog -- a base class for dialogs 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ciaskinteger -- get an integer from the user 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ciaskfloat -- get a float from the user 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ciaskstring -- get a string from the user 247db96d56Sopenharmony_ci""" 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_cifrom tkinter import * 277db96d56Sopenharmony_cifrom tkinter import _get_temp_root, _destroy_temp_root 287db96d56Sopenharmony_cifrom tkinter import messagebox 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ciclass SimpleDialog: 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci def __init__(self, master, 347db96d56Sopenharmony_ci text='', buttons=[], default=None, cancel=None, 357db96d56Sopenharmony_ci title=None, class_=None): 367db96d56Sopenharmony_ci if class_: 377db96d56Sopenharmony_ci self.root = Toplevel(master, class_=class_) 387db96d56Sopenharmony_ci else: 397db96d56Sopenharmony_ci self.root = Toplevel(master) 407db96d56Sopenharmony_ci if title: 417db96d56Sopenharmony_ci self.root.title(title) 427db96d56Sopenharmony_ci self.root.iconname(title) 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci _setup_dialog(self.root) 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci self.message = Message(self.root, text=text, aspect=400) 477db96d56Sopenharmony_ci self.message.pack(expand=1, fill=BOTH) 487db96d56Sopenharmony_ci self.frame = Frame(self.root) 497db96d56Sopenharmony_ci self.frame.pack() 507db96d56Sopenharmony_ci self.num = default 517db96d56Sopenharmony_ci self.cancel = cancel 527db96d56Sopenharmony_ci self.default = default 537db96d56Sopenharmony_ci self.root.bind('<Return>', self.return_event) 547db96d56Sopenharmony_ci for num in range(len(buttons)): 557db96d56Sopenharmony_ci s = buttons[num] 567db96d56Sopenharmony_ci b = Button(self.frame, text=s, 577db96d56Sopenharmony_ci command=(lambda self=self, num=num: self.done(num))) 587db96d56Sopenharmony_ci if num == default: 597db96d56Sopenharmony_ci b.config(relief=RIDGE, borderwidth=8) 607db96d56Sopenharmony_ci b.pack(side=LEFT, fill=BOTH, expand=1) 617db96d56Sopenharmony_ci self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window) 627db96d56Sopenharmony_ci self.root.transient(master) 637db96d56Sopenharmony_ci _place_window(self.root, master) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci def go(self): 667db96d56Sopenharmony_ci self.root.wait_visibility() 677db96d56Sopenharmony_ci self.root.grab_set() 687db96d56Sopenharmony_ci self.root.mainloop() 697db96d56Sopenharmony_ci self.root.destroy() 707db96d56Sopenharmony_ci return self.num 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci def return_event(self, event): 737db96d56Sopenharmony_ci if self.default is None: 747db96d56Sopenharmony_ci self.root.bell() 757db96d56Sopenharmony_ci else: 767db96d56Sopenharmony_ci self.done(self.default) 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci def wm_delete_window(self): 797db96d56Sopenharmony_ci if self.cancel is None: 807db96d56Sopenharmony_ci self.root.bell() 817db96d56Sopenharmony_ci else: 827db96d56Sopenharmony_ci self.done(self.cancel) 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci def done(self, num): 857db96d56Sopenharmony_ci self.num = num 867db96d56Sopenharmony_ci self.root.quit() 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ciclass Dialog(Toplevel): 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci '''Class to open dialogs. 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci This class is intended as a base class for custom dialogs 947db96d56Sopenharmony_ci ''' 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci def __init__(self, parent, title = None): 977db96d56Sopenharmony_ci '''Initialize a dialog. 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci Arguments: 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci parent -- a parent window (the application window) 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci title -- the dialog title 1047db96d56Sopenharmony_ci ''' 1057db96d56Sopenharmony_ci master = parent 1067db96d56Sopenharmony_ci if master is None: 1077db96d56Sopenharmony_ci master = _get_temp_root() 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci Toplevel.__init__(self, master) 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci self.withdraw() # remain invisible for now 1127db96d56Sopenharmony_ci # If the parent is not viewable, don't 1137db96d56Sopenharmony_ci # make the child transient, or else it 1147db96d56Sopenharmony_ci # would be opened withdrawn 1157db96d56Sopenharmony_ci if parent is not None and parent.winfo_viewable(): 1167db96d56Sopenharmony_ci self.transient(parent) 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci if title: 1197db96d56Sopenharmony_ci self.title(title) 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci _setup_dialog(self) 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci self.parent = parent 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci self.result = None 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci body = Frame(self) 1287db96d56Sopenharmony_ci self.initial_focus = self.body(body) 1297db96d56Sopenharmony_ci body.pack(padx=5, pady=5) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci self.buttonbox() 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci if self.initial_focus is None: 1347db96d56Sopenharmony_ci self.initial_focus = self 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci self.protocol("WM_DELETE_WINDOW", self.cancel) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci _place_window(self, parent) 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci self.initial_focus.focus_set() 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci # wait for window to appear on screen before calling grab_set 1437db96d56Sopenharmony_ci self.wait_visibility() 1447db96d56Sopenharmony_ci self.grab_set() 1457db96d56Sopenharmony_ci self.wait_window(self) 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci def destroy(self): 1487db96d56Sopenharmony_ci '''Destroy the window''' 1497db96d56Sopenharmony_ci self.initial_focus = None 1507db96d56Sopenharmony_ci Toplevel.destroy(self) 1517db96d56Sopenharmony_ci _destroy_temp_root(self.master) 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci # 1547db96d56Sopenharmony_ci # construction hooks 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci def body(self, master): 1577db96d56Sopenharmony_ci '''create dialog body. 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci return widget that should have initial focus. 1607db96d56Sopenharmony_ci This method should be overridden, and is called 1617db96d56Sopenharmony_ci by the __init__ method. 1627db96d56Sopenharmony_ci ''' 1637db96d56Sopenharmony_ci pass 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci def buttonbox(self): 1667db96d56Sopenharmony_ci '''add standard button box. 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci override if you do not want the standard buttons 1697db96d56Sopenharmony_ci ''' 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci box = Frame(self) 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE) 1747db96d56Sopenharmony_ci w.pack(side=LEFT, padx=5, pady=5) 1757db96d56Sopenharmony_ci w = Button(box, text="Cancel", width=10, command=self.cancel) 1767db96d56Sopenharmony_ci w.pack(side=LEFT, padx=5, pady=5) 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci self.bind("<Return>", self.ok) 1797db96d56Sopenharmony_ci self.bind("<Escape>", self.cancel) 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci box.pack() 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci # 1847db96d56Sopenharmony_ci # standard button semantics 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci def ok(self, event=None): 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci if not self.validate(): 1897db96d56Sopenharmony_ci self.initial_focus.focus_set() # put focus back 1907db96d56Sopenharmony_ci return 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ci self.withdraw() 1937db96d56Sopenharmony_ci self.update_idletasks() 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci try: 1967db96d56Sopenharmony_ci self.apply() 1977db96d56Sopenharmony_ci finally: 1987db96d56Sopenharmony_ci self.cancel() 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci def cancel(self, event=None): 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci # put focus back to the parent window 2037db96d56Sopenharmony_ci if self.parent is not None: 2047db96d56Sopenharmony_ci self.parent.focus_set() 2057db96d56Sopenharmony_ci self.destroy() 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci # 2087db96d56Sopenharmony_ci # command hooks 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci def validate(self): 2117db96d56Sopenharmony_ci '''validate the data 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci This method is called automatically to validate the data before the 2147db96d56Sopenharmony_ci dialog is destroyed. By default, it always validates OK. 2157db96d56Sopenharmony_ci ''' 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci return 1 # override 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci def apply(self): 2207db96d56Sopenharmony_ci '''process the data 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci This method is called automatically to process the data, *after* 2237db96d56Sopenharmony_ci the dialog is destroyed. By default, it does nothing. 2247db96d56Sopenharmony_ci ''' 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci pass # override 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci# Place a toplevel window at the center of parent or screen 2307db96d56Sopenharmony_ci# It is a Python implementation of ::tk::PlaceWindow. 2317db96d56Sopenharmony_cidef _place_window(w, parent=None): 2327db96d56Sopenharmony_ci w.wm_withdraw() # Remain invisible while we figure out the geometry 2337db96d56Sopenharmony_ci w.update_idletasks() # Actualize geometry information 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci minwidth = w.winfo_reqwidth() 2367db96d56Sopenharmony_ci minheight = w.winfo_reqheight() 2377db96d56Sopenharmony_ci maxwidth = w.winfo_vrootwidth() 2387db96d56Sopenharmony_ci maxheight = w.winfo_vrootheight() 2397db96d56Sopenharmony_ci if parent is not None and parent.winfo_ismapped(): 2407db96d56Sopenharmony_ci x = parent.winfo_rootx() + (parent.winfo_width() - minwidth) // 2 2417db96d56Sopenharmony_ci y = parent.winfo_rooty() + (parent.winfo_height() - minheight) // 2 2427db96d56Sopenharmony_ci vrootx = w.winfo_vrootx() 2437db96d56Sopenharmony_ci vrooty = w.winfo_vrooty() 2447db96d56Sopenharmony_ci x = min(x, vrootx + maxwidth - minwidth) 2457db96d56Sopenharmony_ci x = max(x, vrootx) 2467db96d56Sopenharmony_ci y = min(y, vrooty + maxheight - minheight) 2477db96d56Sopenharmony_ci y = max(y, vrooty) 2487db96d56Sopenharmony_ci if w._windowingsystem == 'aqua': 2497db96d56Sopenharmony_ci # Avoid the native menu bar which sits on top of everything. 2507db96d56Sopenharmony_ci y = max(y, 22) 2517db96d56Sopenharmony_ci else: 2527db96d56Sopenharmony_ci x = (w.winfo_screenwidth() - minwidth) // 2 2537db96d56Sopenharmony_ci y = (w.winfo_screenheight() - minheight) // 2 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci w.wm_maxsize(maxwidth, maxheight) 2567db96d56Sopenharmony_ci w.wm_geometry('+%d+%d' % (x, y)) 2577db96d56Sopenharmony_ci w.wm_deiconify() # Become visible at the desired location 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_cidef _setup_dialog(w): 2617db96d56Sopenharmony_ci if w._windowingsystem == "aqua": 2627db96d56Sopenharmony_ci w.tk.call("::tk::unsupported::MacWindowStyle", "style", 2637db96d56Sopenharmony_ci w, "moveableModal", "") 2647db96d56Sopenharmony_ci elif w._windowingsystem == "x11": 2657db96d56Sopenharmony_ci w.wm_attributes("-type", "dialog") 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci# -------------------------------------------------------------------- 2687db96d56Sopenharmony_ci# convenience dialogues 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ciclass _QueryDialog(Dialog): 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci def __init__(self, title, prompt, 2737db96d56Sopenharmony_ci initialvalue=None, 2747db96d56Sopenharmony_ci minvalue = None, maxvalue = None, 2757db96d56Sopenharmony_ci parent = None): 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci self.prompt = prompt 2787db96d56Sopenharmony_ci self.minvalue = minvalue 2797db96d56Sopenharmony_ci self.maxvalue = maxvalue 2807db96d56Sopenharmony_ci 2817db96d56Sopenharmony_ci self.initialvalue = initialvalue 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci Dialog.__init__(self, parent, title) 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci def destroy(self): 2867db96d56Sopenharmony_ci self.entry = None 2877db96d56Sopenharmony_ci Dialog.destroy(self) 2887db96d56Sopenharmony_ci 2897db96d56Sopenharmony_ci def body(self, master): 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci w = Label(master, text=self.prompt, justify=LEFT) 2927db96d56Sopenharmony_ci w.grid(row=0, padx=5, sticky=W) 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci self.entry = Entry(master, name="entry") 2957db96d56Sopenharmony_ci self.entry.grid(row=1, padx=5, sticky=W+E) 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci if self.initialvalue is not None: 2987db96d56Sopenharmony_ci self.entry.insert(0, self.initialvalue) 2997db96d56Sopenharmony_ci self.entry.select_range(0, END) 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci return self.entry 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci def validate(self): 3047db96d56Sopenharmony_ci try: 3057db96d56Sopenharmony_ci result = self.getresult() 3067db96d56Sopenharmony_ci except ValueError: 3077db96d56Sopenharmony_ci messagebox.showwarning( 3087db96d56Sopenharmony_ci "Illegal value", 3097db96d56Sopenharmony_ci self.errormessage + "\nPlease try again", 3107db96d56Sopenharmony_ci parent = self 3117db96d56Sopenharmony_ci ) 3127db96d56Sopenharmony_ci return 0 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci if self.minvalue is not None and result < self.minvalue: 3157db96d56Sopenharmony_ci messagebox.showwarning( 3167db96d56Sopenharmony_ci "Too small", 3177db96d56Sopenharmony_ci "The allowed minimum value is %s. " 3187db96d56Sopenharmony_ci "Please try again." % self.minvalue, 3197db96d56Sopenharmony_ci parent = self 3207db96d56Sopenharmony_ci ) 3217db96d56Sopenharmony_ci return 0 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci if self.maxvalue is not None and result > self.maxvalue: 3247db96d56Sopenharmony_ci messagebox.showwarning( 3257db96d56Sopenharmony_ci "Too large", 3267db96d56Sopenharmony_ci "The allowed maximum value is %s. " 3277db96d56Sopenharmony_ci "Please try again." % self.maxvalue, 3287db96d56Sopenharmony_ci parent = self 3297db96d56Sopenharmony_ci ) 3307db96d56Sopenharmony_ci return 0 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci self.result = result 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci return 1 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ciclass _QueryInteger(_QueryDialog): 3387db96d56Sopenharmony_ci errormessage = "Not an integer." 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci def getresult(self): 3417db96d56Sopenharmony_ci return self.getint(self.entry.get()) 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_cidef askinteger(title, prompt, **kw): 3457db96d56Sopenharmony_ci '''get an integer from the user 3467db96d56Sopenharmony_ci 3477db96d56Sopenharmony_ci Arguments: 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci title -- the dialog title 3507db96d56Sopenharmony_ci prompt -- the label text 3517db96d56Sopenharmony_ci **kw -- see SimpleDialog class 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci Return value is an integer 3547db96d56Sopenharmony_ci ''' 3557db96d56Sopenharmony_ci d = _QueryInteger(title, prompt, **kw) 3567db96d56Sopenharmony_ci return d.result 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ciclass _QueryFloat(_QueryDialog): 3607db96d56Sopenharmony_ci errormessage = "Not a floating point value." 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci def getresult(self): 3637db96d56Sopenharmony_ci return self.getdouble(self.entry.get()) 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_cidef askfloat(title, prompt, **kw): 3677db96d56Sopenharmony_ci '''get a float from the user 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci Arguments: 3707db96d56Sopenharmony_ci 3717db96d56Sopenharmony_ci title -- the dialog title 3727db96d56Sopenharmony_ci prompt -- the label text 3737db96d56Sopenharmony_ci **kw -- see SimpleDialog class 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci Return value is a float 3767db96d56Sopenharmony_ci ''' 3777db96d56Sopenharmony_ci d = _QueryFloat(title, prompt, **kw) 3787db96d56Sopenharmony_ci return d.result 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ciclass _QueryString(_QueryDialog): 3827db96d56Sopenharmony_ci def __init__(self, *args, **kw): 3837db96d56Sopenharmony_ci if "show" in kw: 3847db96d56Sopenharmony_ci self.__show = kw["show"] 3857db96d56Sopenharmony_ci del kw["show"] 3867db96d56Sopenharmony_ci else: 3877db96d56Sopenharmony_ci self.__show = None 3887db96d56Sopenharmony_ci _QueryDialog.__init__(self, *args, **kw) 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ci def body(self, master): 3917db96d56Sopenharmony_ci entry = _QueryDialog.body(self, master) 3927db96d56Sopenharmony_ci if self.__show is not None: 3937db96d56Sopenharmony_ci entry.configure(show=self.__show) 3947db96d56Sopenharmony_ci return entry 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci def getresult(self): 3977db96d56Sopenharmony_ci return self.entry.get() 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_cidef askstring(title, prompt, **kw): 4017db96d56Sopenharmony_ci '''get a string from the user 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci Arguments: 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ci title -- the dialog title 4067db96d56Sopenharmony_ci prompt -- the label text 4077db96d56Sopenharmony_ci **kw -- see SimpleDialog class 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci Return value is a string 4107db96d56Sopenharmony_ci ''' 4117db96d56Sopenharmony_ci d = _QueryString(title, prompt, **kw) 4127db96d56Sopenharmony_ci return d.result 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ciif __name__ == '__main__': 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci def test(): 4187db96d56Sopenharmony_ci root = Tk() 4197db96d56Sopenharmony_ci def doit(root=root): 4207db96d56Sopenharmony_ci d = SimpleDialog(root, 4217db96d56Sopenharmony_ci text="This is a test dialog. " 4227db96d56Sopenharmony_ci "Would this have been an actual dialog, " 4237db96d56Sopenharmony_ci "the buttons below would have been glowing " 4247db96d56Sopenharmony_ci "in soft pink light.\n" 4257db96d56Sopenharmony_ci "Do you believe this?", 4267db96d56Sopenharmony_ci buttons=["Yes", "No", "Cancel"], 4277db96d56Sopenharmony_ci default=0, 4287db96d56Sopenharmony_ci cancel=2, 4297db96d56Sopenharmony_ci title="Test Dialog") 4307db96d56Sopenharmony_ci print(d.go()) 4317db96d56Sopenharmony_ci print(askinteger("Spam", "Egg count", initialvalue=12*12)) 4327db96d56Sopenharmony_ci print(askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, 4337db96d56Sopenharmony_ci maxvalue=100)) 4347db96d56Sopenharmony_ci print(askstring("Spam", "Egg label")) 4357db96d56Sopenharmony_ci t = Button(root, text='Test', command=doit) 4367db96d56Sopenharmony_ci t.pack() 4377db96d56Sopenharmony_ci q = Button(root, text='Quit', command=t.quit) 4387db96d56Sopenharmony_ci q.pack() 4397db96d56Sopenharmony_ci t.mainloop() 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci test() 442