diff options
Diffstat (limited to 'Tools/pynche/PyncheWidget.py')
-rw-r--r-- | Tools/pynche/PyncheWidget.py | 104 |
1 files changed, 74 insertions, 30 deletions
diff --git a/Tools/pynche/PyncheWidget.py b/Tools/pynche/PyncheWidget.py index 4052357..fcabd24 100644 --- a/Tools/pynche/PyncheWidget.py +++ b/Tools/pynche/PyncheWidget.py @@ -13,36 +13,46 @@ KEEPALIVE_TIMER = 500 class PyncheWidget: - def __init__(self, version, switchboard): + def __init__(self, version, switchboard, master=None): self.__sb = switchboard self.__version = version self.__textwin = None self.__listwin = None self.__detailswin = None - # - # Is there already a default root for Tk, say because we're running - # under Guido's IDE? :-) Two conditions say no, either the import - # fails or _default_root is None. - tkroot = None - try: - from Tkinter import _default_root - tkroot = self.__tkroot = _default_root - except ImportError: - pass - if not tkroot: - tkroot = self.__tkroot = Tk(className='Pynche') - # but this isn't our top level widget, so make it invisible - tkroot.withdraw() + modal = self.__modal = not not master + # If a master was given, we are running as a modal dialog servant to + # some other application. We rearrange our UI in this case (there's + # no File menu and we get `Okay' and `Cancel' buttons), and we do a + # grab_set() to make ourselves modal + if modal: + self.__tkroot = tkroot = Toplevel(master, class_='Pynche') + tkroot.grab_set() + tkroot.withdraw() + else: + # Is there already a default root for Tk, say because we're + # running under Guido's IDE? :-) Two conditions say no, either the + # import fails or _default_root is None. + tkroot = None + try: + from Tkinter import _default_root + tkroot = self.__tkroot = _default_root + except ImportError: + pass + if not tkroot: + tkroot = self.__tkroot = Tk(className='Pynche') + # but this isn't our top level widget, so make it invisible + tkroot.withdraw() # create the menubar menubar = self.__menubar = Menu(tkroot) # # File menu # - filemenu = self.__filemenu = Menu(menubar, tearoff=0) - filemenu.add_command(label='Quit', - command=self.__quit, - accelerator='Alt-Q', - underline=0) + if not modal: + filemenu = self.__filemenu = Menu(menubar, tearoff=0) + filemenu.add_command(label='Quit', + command=self.__quit, + accelerator='Alt-Q', + underline=0) # # View menu # @@ -66,9 +76,10 @@ class PyncheWidget: # # Tie them all together # - menubar.add_cascade(label='File', - menu=filemenu, - underline=0) + if not modal: + menubar.add_cascade(label='File', + menu=filemenu, + underline=0) menubar.add_cascade(label='View', menu=viewmenu, underline=0) @@ -78,15 +89,44 @@ class PyncheWidget: # now create the top level window root = self.__root = Toplevel(tkroot, class_='Pynche', menu=menubar) - root.protocol('WM_DELETE_WINDOW', self.__quit) + root.protocol('WM_DELETE_WINDOW', + modal and self.__beep or self.__quit) root.title('Pynche %s' % version) root.iconname('Pynche') - root.tk.createtimerhandler(KEEPALIVE_TIMER, self.__keepalive) - root.bind('<Alt-q>', self.__quit) - root.bind('<Alt-Q>', self.__quit) + # Only bind accelerators for the File->Quit menu item if running as a + # standalone app + if not modal: + root.bind('<Alt-q>', self.__quit) + root.bind('<Alt-Q>', self.__quit) + else: + # We're a modal dialog so we have a new row of buttons + bframe = Frame(root, borderwidth=1, relief=RAISED) + bframe.grid(row=4, column=0, columnspan=2, + sticky='EW', + ipady=5) + okay = Button(bframe, + text='Okay', + command=self.__okay) + okay.pack(side=LEFT, expand=1) + cancel = Button(bframe, + text='Cancel', + command=self.__cancel) + cancel.pack(side=LEFT, expand=1) def __quit(self, event=None): - self.__root.quit() + self.__tkroot.quit() + + def __beep(self, event=None): + self.__tkroot.beep() + + def __okay(self, event=None): + self.__sb.withdraw_views() + self.__tkroot.grab_release() + self.__quit() + + def __cancel(self, event=None): + self.__sb.canceled() + self.__okay() def __keepalive(self): # Exercise the Python interpreter regularly so keyboard interrupts get @@ -94,10 +134,11 @@ class PyncheWidget: self.__tkroot.tk.createtimerhandler(KEEPALIVE_TIMER, self.__keepalive) def start(self): - self.__keepalive() + if not self.__modal: + self.__keepalive() self.__tkroot.mainloop() - def parent(self): + def window(self): return self.__root def __popup_about(self, event=None): @@ -135,3 +176,6 @@ email : bwarsaw@python.org''' % __version__) self.__detailswin = DetailsViewer(self.__sb, self.__root) self.__sb.add_view(self.__detailswin) self.__detailswin.deiconify() + + def withdraw(self): + self.__root.withdraw() |