diff --git a/Lib/lib-tk/Tix.py b/Lib/lib-tk/Tix.py index 937d36fad26..5f67a72cd25 100755 --- a/Lib/lib-tk/Tix.py +++ b/Lib/lib-tk/Tix.py @@ -1,11 +1,13 @@ +# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- # # $Id$ # -# Tix.py -- Tix widget wrappers, part of PyTix. +# Tix.py -- Tix widget wrappers. +# +# For Tix, see http://tix.sourceforge.net # # - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995. -# based on an idea (and a little code !!) of Jean-Marc Lugrin -# (lugrin@ms.com) +# based on an idea of Jean-Marc Lugrin (lugrin@ms.com) # # NOTE: In order to minimize changes to Tkinter.py, some of the code here # (TixWidget.__init__) has been taken from Tkinter (Widget.__init__) @@ -51,20 +53,161 @@ ACROSSTOP = 'acrosstop' # in Tkinter (to override Widget initialization) and is therefore # liable to break. import Tkinter, os -class Tk(Tkinter.Tk): + +# Could probably add this to Tkinter.Misc +class tixCommand: + """The tix command provides access to miscellaneous elements + of Tix's internal state and the Tix application context. + Most of the information manipulated by this command per + tains to the application as a whole, or to a screen or + display, rather than to a particular window. The command + can take any of a number of different forms depending on + the option argument. + + This is a mixin class, assumed to be mixed to Tkinter.Tk + that supports the self.tk.call method. + """ + def tix_addbitmapdir(self, directory): + """Tix maintains a list of directory under which which + the tix_getimage and tix_getbitmap commands will + search for image files. The standard bitmap direc + tory is $TIX_LIBRARY/bitmaps. The addbitmapdir com + mand adds directory into this list. By using this + command, the image files of an applications can + also be located using the tix_getimage or tix_getbitmap + command. + """ + return self.tk.call('tix', 'addbitmapdir', directory) + + def tix_cget(self, option): + """Returns the current value of the configuration + option given by option. Option may be any of the + options described in the CONFIGURATION OPTIONS section. + """ + return self.tk.call('tix', 'cget', option) + + def tix_configure(self, cnf=None, **kw): + """Query or modify the configuration options of the + Tix application context. If no option is specified, + returns a list describing all of the available + options (see Tk_ConfigureInfo for information on + the format of this list). If option is specified + with no value, then the command returns a list + describing the one named option (this list will be + identical to the corresponding sublist of the value + returned if no option is specified). If one or + more option-value pairs are specified, then the + command modifies the given option(s) to have the + given value(s); in this case the command returns an + empty string. Option may be any of the options + described in the CONFIGURATION OPTIONS section. + """ + return apply(self.tk.call, ('tix', configure) + + self._options(cnf,kw) ) + + def tix_filedialog(self, dlgclass=None): + """Returns the file selection dialog that may be + shared among different modules of this application. + This command will create a file selection dialog + widget when it is called the first time. This dialog + will be returned by all subsequent calls to tix + filedialog. An optional dlgclass parameter can be + passed to specified what type of file selection + dialog widget is desired. Possible options are 'tix' + 'FileSelectDialog' or 'tixExFileSelectDialog'. + """ + if dlgclass is not None: + return self.tk.call('tix', 'filedialog', dlgclass) + else: + return self.tk.call('tix', 'filedialog') + + def tix_getbitmap(self, name): + """Locates a bitmap file of the name name.xpm or name + in one of the bitmap directories (self, see the + tix_addbitmapdir command above). By using tix_getbitmap, + you can advoid hard coding the pathnames of + the bitmap files in your application. When successful, + it returns the complete pathname of the bitmap + file, prefixed with the character '@'. The returned + value can be used to configure the -bitmap option + of the TK and Tix widgets. + """ + return self.tk.call('tix', 'getbitmap', name) + + def tix_getimage(self, name): + """Locates an image file of the name name.xpm, + name.xbm or name.ppm in one of the bitmap directo + ries (see the addbitmapdir command above). If more + than one file with the same name (but different + extensions) exist, then the image type is chosen + according to the depth of the X display: xbm images + are chosen on monochrome displays and color images + are chosen on color displays. By using tix getim + age, you can advoid hard coding the pathnames of + the image files in your application. When success + ful, this command returns the name of the newly + created image, which can be used to configure the + -image option of the TK and Tix widgets. + """ + return self.tk.call('tix', 'getimage', name) + + def tix_option_get(self, name): + """Gets the options manitained by the Tix + scheme mechanism. Available options are: + + active_bg active_fg bg + bold_font dark1_bg dark1_fg + dark2_bg dark2_fg disabled_fg + fg fixed_font font + inactive_bg inactive_fg input1_bg + input2_bg italic_font light1_bg + light1_fg light2_bg light2_fg + menu_font output1_bg output2_bg + select_bg select_fg selector + """ + # could use self.tk.globalgetvar('tixOption', name) + return self.tk.call('tix', 'option', 'get', name) + + def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None): + """Resets the scheme and fontset of the Tix application + to newScheme and newFontSet, respectively. + This affects only those widgets created after this + call. Therefore, it is best to call the resetop + tions command before the creation of any widgets in + a Tix application. + + The optional parameter newScmPrio can be given to + reset the priority level of the TK options set by + the Tix schemes. + + Because of the way TK handles the X option database, after + tixwish has started up, it is not possible to reset the + color schemes and font sets using the tix config command. + Instead, the tix resetoptions command must be used. + """ + if newScmPrio is not None: + return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio) + else: + return self.tk.call('tix', 'resetoptions', newScheme, newFontSet) + +class Tk(Tkinter.Tk, tixCommand): """Toplevel widget of Tix which represents mostly the main window of an application. It has an associated Tcl interpreter.""" - def __init__(self, screenName=None, baseName=None, className='Tk'): + def __init__(self, screenName=None, baseName=None, className='Tix'): Tkinter.Tk.__init__(self, screenName, baseName, className) tixlib = os.environ.get('TIX_LIBRARY') + self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]') if tixlib is not None: self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib) self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib) # Load Tix - this should work dynamically or statically - # If it's static, lib/tix8.1/pkgIndex.tcl should have 'load {} Tix' - # If it's dynamic, it should have 'load libtix8.1.8.2.so Tix' + # If it's static, lib/tix8.1/pkgIndex.tcl should have + # 'load {} Tix' + # If it's dynamic, lib/tix8.1/pkgIndex.tcl should have + # 'load libtix8.1.8.3.so Tix' self.tk.eval('package require Tix') + # The Tix 'tixForm' geometry manager class Form: """The Tix Form geometry manager @@ -108,15 +251,17 @@ class Form: self.tk.splitlist( self.tk.call( 'tixForm', 'slaves', self._w))) + + Tkinter.Widget.__bases__ = Tkinter.Widget.__bases__ + (Form,) -class TixWidget(Widget): +class TixWidget(Tkinter.Widget): """A TixWidget class is used to package all (or most) Tix widgets. Widget initialization is extended in two ways: - 1) It is possible to give a list of options which must be part of + 1) It is possible to give a list of options which must be part of the creation command (so called Tix 'static' options). These cannot be given as a 'config' command later. 2) It is possible to give the name of an existing TK widget. These are @@ -169,13 +314,13 @@ class TixWidget(Widget): return self.subwidget_list[name] raise AttributeError, name - # Set a variable without calling its action routine def set_silent(self, value): + """Set a variable without calling its action routine""" self.tk.call('tixSetSilent', self._w, value) - # Return the named subwidget (which must have been created by - # the sub-class). def subwidget(self, name): + """Return the named subwidget (which must have been created by + the sub-class).""" n = self._subwidget_name(name) if not n: raise TclError, "Subwidget " + name + " not child of " + self._name @@ -183,8 +328,8 @@ class TixWidget(Widget): n = n[len(self._w)+1:] return self._nametowidget(n) - # Return all subwidgets def subwidgets_all(self): + """Return all subwidgets.""" names = self._subwidget_names() if not names: return [] @@ -198,23 +343,23 @@ class TixWidget(Widget): pass return retlist - # Get a subwidget name (returns a String, not a Widget !) def _subwidget_name(self,name): + """Get a subwidget name (returns a String, not a Widget !)""" try: return self.tk.call(self._w, 'subwidget', name) except TclError: return None - # Return the name of all subwidgets def _subwidget_names(self): + """Return the name of all subwidgets.""" try: x = self.tk.call(self._w, 'subwidgets', '-all') return self.tk.split(x) except TclError: return None - # Set configuration options for all subwidgets (and self) def config_all(self, option, value): + """Set configuration options for all subwidgets (and self).""" if option == '': return elif type(option) != type(''): @@ -360,7 +505,9 @@ class Balloon(TixWidget): self.tk.call(self._w, 'unbind', widget._w) class ButtonBox(TixWidget): - """ButtonBox - A container for pushbuttons""" + """ButtonBox - A container for pushbuttons. + Subwidgets are the buttons added with the add method. + """ def __init__(self, master=None, cnf={}, **kw): TixWidget.__init__(self, master, 'tixButtonBox', ['orientation', 'options'], cnf, kw) @@ -378,15 +525,17 @@ class ButtonBox(TixWidget): self.tk.call(self._w, 'invoke', name) class ComboBox(TixWidget): - """ComboBox - an Entry field with a dropdown menu + """ComboBox - an Entry field with a dropdown menu. The user can select a + choice by either typing in the entry subwdget or selecting from the + listbox subwidget. Subwidget Class --------- ----- entry Entry arrow Button - slistbox ScrolledListBox - tick Button } - cross Button } present if created with the fancy option""" + slistbox ScrolledListBox + tick Button + cross Button : present if created with the fancy option""" def __init__ (self, master=None, cnf={}, **kw): TixWidget.__init__(self, master, 'tixComboBox', @@ -417,7 +566,10 @@ class ComboBox(TixWidget): self.tk.call(self._w, 'pick', index) class Control(TixWidget): - """Control - An entry field with value change arrows. + """Control - An entry field with value change arrows. The user can + adjust the value by pressing the two arrow buttons or by entering + the value directly into the entry. The new value will be checked + against the user-defined upper and lower limits. Subwidget Class --------- ----- @@ -446,7 +598,9 @@ class Control(TixWidget): self.tk.call(self._w, 'update') class DirList(TixWidget): - """DirList - Directory Listing. + """DirList - displays a list view of a directory, its previous + directories and its sub-directories. The user can choose one of + the directories displayed in the list or change to another directory. Subwidget Class --------- ----- @@ -464,7 +618,10 @@ class DirList(TixWidget): self.tk.call(self._w, 'chdir', dir) class DirTree(TixWidget): - """DirList - Directory Listing in a hierarchical view. + """DirTree - Directory Listing in a hierarchical view. + Displays a tree view of a directory, its previous directories and its + sub-directories. The user can choose one of the directories displayed + in the list or change to another directory. Subwidget Class --------- ----- @@ -481,8 +638,28 @@ class DirTree(TixWidget): def chdir(self, dir): self.tk.call(self._w, 'chdir', dir) +class DirSelectBox(TixWidget): + """DirSelectBox - Motif style file select box. + It is generally used for + the user to choose a file. FileSelectBox stores the files mostly + recently selected into a ComboBox widget so that they can be quickly + selected again. + + Subwidget Class + --------- ----- + selection ComboBox + filter ComboBox + dirlist ScrolledListBox + filelist ScrolledListBox""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw) + self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') + self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') + class ExFileSelectBox(TixWidget): """ExFileSelectBox - MS Windows style file select box. + It provides an convenient method for the user to select files. Subwidget Class --------- ----- @@ -512,8 +689,34 @@ class ExFileSelectBox(TixWidget): def invoke(self): self.tk.call(self._w, 'invoke') + +# Should inherit from a Dialog class +class DirSelectDialog(TixWidget): + """The DirSelectDialog widget presents the directories in the file + system in a dialog window. The user can use this dialog window to + navigate through the file system to select the desired directory. + + Subwidgets Class + ---------- ----- + dirbox DirSelectDialog""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirSelectDialog', + ['options'], cnf, kw) + self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox') + # cancel and ok buttons are missing + + def popup(self): + self.tk.call(self._w, 'popup') + + def popdown(self): + self.tk.call(self._w, 'popdown') + + +# Should inherit from a Dialog class class ExFileSelectDialog(TixWidget): """ExFileSelectDialog - MS Windows style file select dialog. + It provides an convenient method for the user to select files. Subwidgets Class ---------- ----- @@ -532,7 +735,11 @@ class ExFileSelectDialog(TixWidget): class FileSelectBox(TixWidget): """ExFileSelectBox - Motif style file select box. - + It is generally used for + the user to choose a file. FileSelectBox stores the files mostly + recently selected into a ComboBox widget so that they can be quickly + selected again. + Subwidget Class --------- ----- selection ComboBox @@ -553,6 +760,7 @@ class FileSelectBox(TixWidget): def invoke(self): self.tk.call(self._w, 'invoke') +# Should inherit from a Dialog class class FileSelectDialog(TixWidget): """FileSelectDialog - Motif style file select dialog. @@ -574,7 +782,10 @@ class FileSelectDialog(TixWidget): self.tk.call(self._w, 'popdown') class FileEntry(TixWidget): - """FileEntry - Entry field with button that invokes a FileSelectDialog + """FileEntry - Entry field with button that invokes a FileSelectDialog. + The user can type in the filename manually. Alternatively, the user can + press the button widget that sits next to the entry, which will bring + up a file selection dialog. Subwidgets Class ---------- ----- @@ -595,7 +806,10 @@ class FileEntry(TixWidget): pass class HList(TixWidget): - """HList - Hierarchy display. + """HList - Hierarchy display widget can be used to display any data + that have a hierarchical structure, for example, file system directory + trees. The list entries are indented and connected by branch lines + according to their places in the hierachy. Subwidgets - None""" @@ -785,7 +999,9 @@ class InputOnly(TixWidget): TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw) class LabelEntry(TixWidget): - """LabelEntry - Entry field with label. + """LabelEntry - Entry field with label. Packages an entry widget + and a label into one mega widget. It can beused be used to simplify + the creation of ``entry-form'' type of interface. Subwidgets Class ---------- ----- @@ -799,7 +1015,10 @@ class LabelEntry(TixWidget): self.subwidget_list['entry'] = _dummyEntry(self, 'entry') class LabelFrame(TixWidget): - """LabelFrame - Labelled Frame container. + """LabelFrame - Labelled Frame container. Packages a frame widget + and a label into one mega widget. To create widgets inside a + LabelFrame widget, one creates the new widgets relative to the + frame subwidget and manage them inside the frame subwidget. Subwidgets Class ---------- ----- @@ -812,13 +1031,46 @@ class LabelFrame(TixWidget): self.subwidget_list['label'] = _dummyLabel(self, 'label') self.subwidget_list['frame'] = _dummyFrame(self, 'frame') + +class ListNoteBook(TixWidget): + """A ListNoteBook widget is very similar to the TixNoteBook widget: + it can be used to display many windows in a limited space using a + notebook metaphor. The notebook is divided into a stack of pages + (windows). At one time only one of these pages can be shown. + The user can navigate through these pages by + choosing the name of the desired page in the hlist subwidget.""" + + def __init__(self, master, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'vsb') + + + def add(self, name, cnf={}, **kw): + apply(self.tk.call, + (self._w, 'add', name) + self._options(cnf, kw)) + self.subwidget_list[name] = TixSubWidget(self, name) + return self.subwidget_list[name] + + def raise_page(self, name): # raise is a python keyword + self.tk.call(self._w, 'raise', name) + +class Meter(TixWidget): + """The Meter widget can be used to show the progress of a background + job which may take a long time to execute. + """ + + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixMeter', + ['options'], cnf, kw) + class NoteBook(TixWidget): """NoteBook - Multi-page container widget (tabbed notebook metaphor). Subwidgets Class ---------- ----- nbframe NoteBookFrame - g/p widgets added dynamically""" + page widgets added dynamically with the add method""" def __init__ (self,master=None,cnf={}, **kw): TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw) @@ -856,7 +1108,7 @@ class NoteBookFrame(TixWidget): pass class OptionMenu(TixWidget): - """OptionMenu - Option menu widget. + """OptionMenu - creates a menu button of options. Subwidget Class --------- ----- @@ -886,11 +1138,15 @@ class OptionMenu(TixWidget): self.tk.call(self._w, 'enable', name) class PanedWindow(TixWidget): - """PanedWindow - Multi-pane container widget. Panes are resizable. + """PanedWindow - Multi-pane container widget + allows the user to interactively manipulate the sizes of several + panes. The panes can be arranged either vertically or horizontally.The + user changes the sizes of the panes by dragging the resize handle + between two panes. Subwidgets Class ---------- ----- - g/p widgets added dynamically""" + g/p widgets added dynamically with the add method.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw) @@ -910,7 +1166,10 @@ class PanedWindow(TixWidget): return ret class PopupMenu(TixWidget): - """PopupMenu widget. + """PopupMenu widget can be used as a replacement of the tk_popup command. + The advantage of the Tix PopupMenu widget is it requires less application + code to manipulate. + Subwidgets Class ---------- ----- @@ -932,7 +1191,7 @@ class PopupMenu(TixWidget): self.tk.call(self._w, 'post', widget._w, x, y) class ResizeHandle(TixWidget): - """Incomplete - no documentation in Tix for this !!!""" + """Internal widget to draw resize handles on Scrolled widgets.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixResizeHandle', @@ -942,7 +1201,7 @@ class ResizeHandle(TixWidget): self.tk.call(self._w, 'attachwidget', widget._w) class ScrolledHList(TixWidget): - """ScrolledHList - HList with scrollbars.""" + """ScrolledHList - HList with automatic scrollbars.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixScrolledHList', ['options'], @@ -952,7 +1211,7 @@ class ScrolledHList(TixWidget): self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') class ScrolledListBox(TixWidget): - """ScrolledListBox - Listbox with scrollbars.""" + """ScrolledListBox - Listbox with automatic scrollbars.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw) @@ -961,7 +1220,7 @@ class ScrolledListBox(TixWidget): self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') class ScrolledText(TixWidget): - """ScrolledText - Text with scrollbars.""" + """ScrolledText - Text with automatic scrollbars.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw) @@ -970,7 +1229,7 @@ class ScrolledText(TixWidget): self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') class ScrolledTList(TixWidget): - """ScrolledTList - TList with scrollbars.""" + """ScrolledTList - TList with automatic scrollbars.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixScrolledTList', ['options'], @@ -980,7 +1239,7 @@ class ScrolledTList(TixWidget): self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') class ScrolledWindow(TixWidget): - """ScrolledWindow - Window with scrollbars.""" + """ScrolledWindow - Window with automatic scrollbars.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw) @@ -989,9 +1248,10 @@ class ScrolledWindow(TixWidget): self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') class Select(TixWidget): - """Select - Container for buttons. Can enforce radio buttons etc. + """Select - Container of button subwidgets. It can be used to provide + radio-box or check-box style of selection options for the user. - Subwidgets are buttons added dynamically""" + Subwidgets are buttons added dynamically using the add method.""" def __init__(self, master, cnf={}, **kw): TixWidget.__init__(self, master, 'tixSelect', @@ -1025,7 +1285,12 @@ class StdButtonBox(TixWidget): self.tk.call(self._w, 'invoke', name) class TList(TixWidget): - """TList - Hierarchy display. + """TList - Hierarchy display widget which can be + used to display data in a tabular format. The list entries of a TList + widget are similar to the entries in the Tk listbox widget. The main + differences are (1) the TList widget can display the list entries in a + two dimensional format and (2) you can use graphical images as well as + multiple colors and fonts for the list entries. Subwidgets - None""" @@ -1111,7 +1376,9 @@ class TList(TixWidget): apply(self.tk.call, (self._w, 'yview') + args) class Tree(TixWidget): - """Tree - The tixTree widget (general purpose DirList like widget)""" + """Tree - The tixTree widget can be used to display hierachical + data in a tree form. The user can adjust + the view of the tree by opening or closing parts of the tree.""" def __init__(self, master=None, cnf={}, **kw): TixWidget.__init__(self, master, 'tixTree', @@ -1135,6 +1402,45 @@ class Tree(TixWidget): def setmode(self, entrypath, mode='none'): self.tk.call(self._w, 'setmode', entrypath, mode) + +# Could try subclassing Tree for CheckList - would need another arg to init +class CheckList(TixWidget): + """The CheckList widget + displays a list of items to be selected by the user. CheckList acts + similarly to the Tk checkbutton or radiobutton widgets, except it is + capable of handling many more items than checkbuttons or radiobuttons. + """ + + def __init__(self, master=None, cnf={}, **kw): + TixWidget.__init__(self, master, 'tixCheckList', + ['options'], cnf, kw) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + + def autosetmode(self): + self.tk.call(self._w, 'autosetmode') + + def close(self, entrypath): + self.tk.call(self._w, 'close', entrypath) + + def getmode(self, entrypath): + return self.tk.call(self._w, 'getmode', entrypath) + + def open(self, entrypath): + self.tk.call(self._w, 'open', entrypath) + + def getselection(self, mode='on'): + '''Mode can be on, off, default''' + self.tk.call(self._w, 'getselection', mode) + + def getstatus(self, entrypath): + self.tk.call(self._w, 'getstatus', entrypath) + + def setstatus(self, entrypath, mode='on'): + self.tk.call(self._w, 'setstatus', entrypath, mode) + + ########################################################################### ### The subclassing below is used to instantiate the subwidgets in each ### ### mega widget. This allows us to access their methods directly. ### @@ -1191,6 +1497,13 @@ class _dummyHList(HList, TixSubWidget): def __init__(self, master, name, destroy_physically=1): TixSubWidget.__init__(self, master, name, destroy_physically) +class _dummyScrolledHList(ScrolledHList, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') + self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') + self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') + class _dummyTList(TList, TixSubWidget): def __init__(self, master, name, destroy_physically=1): TixSubWidget.__init__(self, master, name, destroy_physically) @@ -1200,8 +1513,11 @@ class _dummyComboBox(ComboBox, TixSubWidget): TixSubWidget.__init__(self, master, name, destroy_physically) self.subwidget_list['entry'] = _dummyEntry(self, 'entry') self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') + # I'm not sure about this destroy_physically=0 in all cases; + # it may depend on if -dropdown is true; I've added as a trial self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, - 'slistbox') + 'slistbox', + destroy_physically=0) self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox', destroy_physically=0) @@ -1212,6 +1528,12 @@ class _dummyDirList(DirList, TixSubWidget): self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') +class _dummyDirSelectBox(DirSelectBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') + self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') + class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget): def __init__(self, master, name, destroy_physically=1): TixSubWidget.__init__(self, master, name, destroy_physically) @@ -1232,6 +1554,11 @@ class _dummyFileSelectBox(FileSelectBox, TixSubWidget): self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') +class _dummyFileComboBox(ComboBox, TixSubWidget): + def __init__(self, master, name, destroy_physically=1): + TixSubWidget.__init__(self, master, name, destroy_physically) + self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx') + class _dummyStdButtonBox(StdButtonBox, TixSubWidget): def __init__(self, master, name, destroy_physically=1): TixSubWidget.__init__(self, master, name, destroy_physically) @@ -1264,3 +1591,13 @@ def FileTypeList(dict): s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} ' return s +# Still to be done: +class CObjView(TixWidget): + """This file implements the Canvas Object View widget. This is a base + class of IconView. It implements automatic placement/adjustment of the + scrollbars according to the canvas objects inside the canvas subwidget. + The scrollbars are adjusted so that the canvas is just large enough + to see all the objects. + """ + pass + diff --git a/Misc/NEWS b/Misc/NEWS index 0dfb969a4a8..ba2f679044f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,11 @@ Extension modules Library +- Tix exposes more commands through the classes DirSelectBox, + DirSelectDialog, ListNoteBook, Meter, CheckList, and the + methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog, + tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions. + - Traceback objects are now scanned by cyclic garbage collection, so cycles created by casual use of sys.exc_info() no longer cause permanent memory leaks (provided garbage collection is enabled).