1# Tix.py -- Tix widget wrappers. 2# 3# For Tix, see http://tix.sourceforge.net 4# 5# - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995. 6# based on an idea of Jean-Marc Lugrin (lugrin@ms.com) 7# 8# NOTE: In order to minimize changes to Tkinter.py, some of the code here 9# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__) 10# and will break if there are major changes in Tkinter. 11# 12# The Tix widgets are represented by a class hierarchy in python with proper 13# inheritance of base classes. 14# 15# As a result after creating a 'w = StdButtonBox', I can write 16# w.ok['text'] = 'Who Cares' 17# or w.ok['bg'] = w['bg'] 18# or even w.ok.invoke() 19# etc. 20# 21# Compare the demo tixwidgets.py to the original Tcl program and you will 22# appreciate the advantages. 23# 24 25import os 26import tkinter 27from tkinter import * 28from tkinter import _cnfmerge 29 30import _tkinter # If this fails your Python may not be configured for Tk 31 32# Some more constants (for consistency with Tkinter) 33WINDOW = 'window' 34TEXT = 'text' 35STATUS = 'status' 36IMMEDIATE = 'immediate' 37IMAGE = 'image' 38IMAGETEXT = 'imagetext' 39BALLOON = 'balloon' 40AUTO = 'auto' 41ACROSSTOP = 'acrosstop' 42 43# A few useful constants for the Grid widget 44ASCII = 'ascii' 45CELL = 'cell' 46COLUMN = 'column' 47DECREASING = 'decreasing' 48INCREASING = 'increasing' 49INTEGER = 'integer' 50MAIN = 'main' 51MAX = 'max' 52REAL = 'real' 53ROW = 'row' 54S_REGION = 's-region' 55X_REGION = 'x-region' 56Y_REGION = 'y-region' 57 58# Some constants used by Tkinter dooneevent() 59TCL_DONT_WAIT = 1 << 1 60TCL_WINDOW_EVENTS = 1 << 2 61TCL_FILE_EVENTS = 1 << 3 62TCL_TIMER_EVENTS = 1 << 4 63TCL_IDLE_EVENTS = 1 << 5 64TCL_ALL_EVENTS = 0 65 66# BEWARE - this is implemented by copying some code from the Widget class 67# in Tkinter (to override Widget initialization) and is therefore 68# liable to break. 69 70# Could probably add this to Tkinter.Misc 71class tixCommand: 72 """The tix commands provide access to miscellaneous elements 73 of Tix's internal state and the Tix application context. 74 Most of the information manipulated by these commands pertains 75 to the application as a whole, or to a screen or 76 display, rather than to a particular window. 77 78 This is a mixin class, assumed to be mixed to Tkinter.Tk 79 that supports the self.tk.call method. 80 """ 81 82 def tix_addbitmapdir(self, directory): 83 """Tix maintains a list of directories under which 84 the tix_getimage and tix_getbitmap commands will 85 search for image files. The standard bitmap directory 86 is $TIX_LIBRARY/bitmaps. The addbitmapdir command 87 adds directory into this list. By using this 88 command, the image files of an applications can 89 also be located using the tix_getimage or tix_getbitmap 90 command. 91 """ 92 return self.tk.call('tix', 'addbitmapdir', directory) 93 94 def tix_cget(self, option): 95 """Returns the current value of the configuration 96 option given by option. Option may be any of the 97 options described in the CONFIGURATION OPTIONS section. 98 """ 99 return self.tk.call('tix', 'cget', option) 100 101 def tix_configure(self, cnf=None, **kw): 102 """Query or modify the configuration options of the Tix application 103 context. If no option is specified, returns a dictionary all of the 104 available options. If option is specified with no value, then the 105 command returns a list describing the one named option (this list 106 will be identical to the corresponding sublist of the value 107 returned if no option is specified). If one or more option-value 108 pairs are specified, then the command modifies the given option(s) 109 to have the given value(s); in this case the command returns an 110 empty string. Option may be any of the configuration options. 111 """ 112 # Copied from Tkinter.py 113 if kw: 114 cnf = _cnfmerge((cnf, kw)) 115 elif cnf: 116 cnf = _cnfmerge(cnf) 117 if cnf is None: 118 return self._getconfigure('tix', 'configure') 119 if isinstance(cnf, str): 120 return self._getconfigure1('tix', 'configure', '-'+cnf) 121 return self.tk.call(('tix', 'configure') + self._options(cnf)) 122 123 def tix_filedialog(self, dlgclass=None): 124 """Returns the file selection dialog that may be shared among 125 different calls from this application. This command will create a 126 file selection dialog widget when it is called the first time. This 127 dialog will be returned by all subsequent calls to tix_filedialog. 128 An optional dlgclass parameter can be passed to specified what type 129 of file selection dialog widget is desired. Possible options are 130 tix FileSelectDialog or tixExFileSelectDialog. 131 """ 132 if dlgclass is not None: 133 return self.tk.call('tix', 'filedialog', dlgclass) 134 else: 135 return self.tk.call('tix', 'filedialog') 136 137 def tix_getbitmap(self, name): 138 """Locates a bitmap file of the name name.xpm or name in one of the 139 bitmap directories (see the tix_addbitmapdir command above). By 140 using tix_getbitmap, you can avoid hard coding the pathnames of the 141 bitmap files in your application. When successful, it returns the 142 complete pathname of the bitmap file, prefixed with the character 143 '@'. The returned value can be used to configure the -bitmap 144 option of the TK and Tix widgets. 145 """ 146 return self.tk.call('tix', 'getbitmap', name) 147 148 def tix_getimage(self, name): 149 """Locates an image file of the name name.xpm, name.xbm or name.ppm 150 in one of the bitmap directories (see the addbitmapdir command 151 above). If more than one file with the same name (but different 152 extensions) exist, then the image type is chosen according to the 153 depth of the X display: xbm images are chosen on monochrome 154 displays and color images are chosen on color displays. By using 155 tix_ getimage, you can avoid hard coding the pathnames of the 156 image files in your application. When successful, this command 157 returns the name of the newly created image, which can be used to 158 configure the -image option of the Tk and Tix widgets. 159 """ 160 return self.tk.call('tix', 'getimage', name) 161 162 def tix_option_get(self, name): 163 """Gets the options maintained by the Tix 164 scheme mechanism. Available options include: 165 166 active_bg active_fg bg 167 bold_font dark1_bg dark1_fg 168 dark2_bg dark2_fg disabled_fg 169 fg fixed_font font 170 inactive_bg inactive_fg input1_bg 171 input2_bg italic_font light1_bg 172 light1_fg light2_bg light2_fg 173 menu_font output1_bg output2_bg 174 select_bg select_fg selector 175 """ 176 # could use self.tk.globalgetvar('tixOption', name) 177 return self.tk.call('tix', 'option', 'get', name) 178 179 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None): 180 """Resets the scheme and fontset of the Tix application to 181 newScheme and newFontSet, respectively. This affects only those 182 widgets created after this call. Therefore, it is best to call the 183 resetoptions command before the creation of any widgets in a Tix 184 application. 185 186 The optional parameter newScmPrio can be given to reset the 187 priority level of the Tk options set by the Tix schemes. 188 189 Because of the way Tk handles the X option database, after Tix has 190 been has imported and inited, it is not possible to reset the color 191 schemes and font sets using the tix config command. Instead, the 192 tix_resetoptions command must be used. 193 """ 194 if newScmPrio is not None: 195 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio) 196 else: 197 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet) 198 199class Tk(tkinter.Tk, tixCommand): 200 """Toplevel widget of Tix which represents mostly the main window 201 of an application. It has an associated Tcl interpreter.""" 202 def __init__(self, screenName=None, baseName=None, className='Tix'): 203 tkinter.Tk.__init__(self, screenName, baseName, className) 204 tixlib = os.environ.get('TIX_LIBRARY') 205 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]') 206 if tixlib is not None: 207 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib) 208 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib) 209 # Load Tix - this should work dynamically or statically 210 # If it's static, tcl/tix8.1/pkgIndex.tcl should have 211 # 'load {} Tix' 212 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have 213 # 'load libtix8.1.8.3.so Tix' 214 self.tk.eval('package require Tix') 215 216 def destroy(self): 217 # For safety, remove the delete_window binding before destroy 218 self.protocol("WM_DELETE_WINDOW", "") 219 tkinter.Tk.destroy(self) 220 221# The Tix 'tixForm' geometry manager 222class Form: 223 """The Tix Form geometry manager 224 225 Widgets can be arranged by specifying attachments to other widgets. 226 See Tix documentation for complete details""" 227 228 def config(self, cnf={}, **kw): 229 self.tk.call('tixForm', self._w, *self._options(cnf, kw)) 230 231 form = config 232 233 def __setitem__(self, key, value): 234 Form.form(self, {key: value}) 235 236 def check(self): 237 return self.tk.call('tixForm', 'check', self._w) 238 239 def forget(self): 240 self.tk.call('tixForm', 'forget', self._w) 241 242 def grid(self, xsize=0, ysize=0): 243 if (not xsize) and (not ysize): 244 x = self.tk.call('tixForm', 'grid', self._w) 245 y = self.tk.splitlist(x) 246 z = () 247 for x in y: 248 z = z + (self.tk.getint(x),) 249 return z 250 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize) 251 252 def info(self, option=None): 253 if not option: 254 return self.tk.call('tixForm', 'info', self._w) 255 if option[0] != '-': 256 option = '-' + option 257 return self.tk.call('tixForm', 'info', self._w, option) 258 259 def slaves(self): 260 return [self._nametowidget(x) for x in 261 self.tk.splitlist( 262 self.tk.call( 263 'tixForm', 'slaves', self._w))] 264 265 266 267tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,) 268 269class TixWidget(tkinter.Widget): 270 """A TixWidget class is used to package all (or most) Tix widgets. 271 272 Widget initialization is extended in two ways: 273 1) It is possible to give a list of options which must be part of 274 the creation command (so called Tix 'static' options). These cannot be 275 given as a 'config' command later. 276 2) It is possible to give the name of an existing TK widget. These are 277 child widgets created automatically by a Tix mega-widget. The Tk call 278 to create these widgets is therefore bypassed in TixWidget.__init__ 279 280 Both options are for use by subclasses only. 281 """ 282 def __init__ (self, master=None, widgetName=None, 283 static_options=None, cnf={}, kw={}): 284 # Merge keywords and dictionary arguments 285 if kw: 286 cnf = _cnfmerge((cnf, kw)) 287 else: 288 cnf = _cnfmerge(cnf) 289 290 # Move static options into extra. static_options must be 291 # a list of keywords (or None). 292 extra=() 293 294 # 'options' is always a static option 295 if static_options: 296 static_options.append('options') 297 else: 298 static_options = ['options'] 299 300 for k,v in list(cnf.items()): 301 if k in static_options: 302 extra = extra + ('-' + k, v) 303 del cnf[k] 304 305 self.widgetName = widgetName 306 Widget._setup(self, master, cnf) 307 308 # If widgetName is None, this is a dummy creation call where the 309 # corresponding Tk widget has already been created by Tix 310 if widgetName: 311 self.tk.call(widgetName, self._w, *extra) 312 313 # Non-static options - to be done via a 'config' command 314 if cnf: 315 Widget.config(self, cnf) 316 317 # Dictionary to hold subwidget names for easier access. We can't 318 # use the children list because the public Tix names may not be the 319 # same as the pathname component 320 self.subwidget_list = {} 321 322 # We set up an attribute access function so that it is possible to 323 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello' 324 # when w is a StdButtonBox. 325 # We can even do w.ok.invoke() because w.ok is subclassed from the 326 # Button class if you go through the proper constructors 327 def __getattr__(self, name): 328 if name in self.subwidget_list: 329 return self.subwidget_list[name] 330 raise AttributeError(name) 331 332 def set_silent(self, value): 333 """Set a variable without calling its action routine""" 334 self.tk.call('tixSetSilent', self._w, value) 335 336 def subwidget(self, name): 337 """Return the named subwidget (which must have been created by 338 the sub-class).""" 339 n = self._subwidget_name(name) 340 if not n: 341 raise TclError("Subwidget " + name + " not child of " + self._name) 342 # Remove header of name and leading dot 343 n = n[len(self._w)+1:] 344 return self._nametowidget(n) 345 346 def subwidgets_all(self): 347 """Return all subwidgets.""" 348 names = self._subwidget_names() 349 if not names: 350 return [] 351 retlist = [] 352 for name in names: 353 name = name[len(self._w)+1:] 354 try: 355 retlist.append(self._nametowidget(name)) 356 except: 357 # some of the widgets are unknown e.g. border in LabelFrame 358 pass 359 return retlist 360 361 def _subwidget_name(self,name): 362 """Get a subwidget name (returns a String, not a Widget !)""" 363 try: 364 return self.tk.call(self._w, 'subwidget', name) 365 except TclError: 366 return None 367 368 def _subwidget_names(self): 369 """Return the name of all subwidgets.""" 370 try: 371 x = self.tk.call(self._w, 'subwidgets', '-all') 372 return self.tk.splitlist(x) 373 except TclError: 374 return None 375 376 def config_all(self, option, value): 377 """Set configuration options for all subwidgets (and self).""" 378 if option == '': 379 return 380 elif not isinstance(option, str): 381 option = repr(option) 382 if not isinstance(value, str): 383 value = repr(value) 384 names = self._subwidget_names() 385 for name in names: 386 self.tk.call(name, 'configure', '-' + option, value) 387 # These are missing from Tkinter 388 def image_create(self, imgtype, cnf={}, master=None, **kw): 389 if not master: 390 master = self 391 if kw and cnf: cnf = _cnfmerge((cnf, kw)) 392 elif kw: cnf = kw 393 options = () 394 for k, v in cnf.items(): 395 if callable(v): 396 v = self._register(v) 397 options = options + ('-'+k, v) 398 return master.tk.call(('image', 'create', imgtype,) + options) 399 def image_delete(self, imgname): 400 try: 401 self.tk.call('image', 'delete', imgname) 402 except TclError: 403 # May happen if the root was destroyed 404 pass 405 406# Subwidgets are child widgets created automatically by mega-widgets. 407# In python, we have to create these subwidgets manually to mirror their 408# existence in Tk/Tix. 409class TixSubWidget(TixWidget): 410 """Subwidget class. 411 412 This is used to mirror child widgets automatically created 413 by Tix/Tk as part of a mega-widget in Python (which is not informed 414 of this)""" 415 416 def __init__(self, master, name, 417 destroy_physically=1, check_intermediate=1): 418 if check_intermediate: 419 path = master._subwidget_name(name) 420 try: 421 path = path[len(master._w)+1:] 422 plist = path.split('.') 423 except: 424 plist = [] 425 426 if not check_intermediate: 427 # immediate descendant 428 TixWidget.__init__(self, master, None, None, {'name' : name}) 429 else: 430 # Ensure that the intermediate widgets exist 431 parent = master 432 for i in range(len(plist) - 1): 433 n = '.'.join(plist[:i+1]) 434 try: 435 w = master._nametowidget(n) 436 parent = w 437 except KeyError: 438 # Create the intermediate widget 439 parent = TixSubWidget(parent, plist[i], 440 destroy_physically=0, 441 check_intermediate=0) 442 # The Tk widget name is in plist, not in name 443 if plist: 444 name = plist[-1] 445 TixWidget.__init__(self, parent, None, None, {'name' : name}) 446 self.destroy_physically = destroy_physically 447 448 def destroy(self): 449 # For some widgets e.g., a NoteBook, when we call destructors, 450 # we must be careful not to destroy the frame widget since this 451 # also destroys the parent NoteBook thus leading to an exception 452 # in Tkinter when it finally calls Tcl to destroy the NoteBook 453 for c in list(self.children.values()): c.destroy() 454 if self._name in self.master.children: 455 del self.master.children[self._name] 456 if self._name in self.master.subwidget_list: 457 del self.master.subwidget_list[self._name] 458 if self.destroy_physically: 459 # This is bypassed only for a few widgets 460 self.tk.call('destroy', self._w) 461 462 463# Useful class to create a display style - later shared by many items. 464# Contributed by Steffen Kremser 465class DisplayStyle: 466 """DisplayStyle - handle configuration options shared by 467 (multiple) Display Items""" 468 469 def __init__(self, itemtype, cnf={}, *, master=None, **kw): 470 if not master: 471 if 'refwindow' in kw: 472 master = kw['refwindow'] 473 elif 'refwindow' in cnf: 474 master = cnf['refwindow'] 475 else: 476 master = tkinter._get_default_root('create display style') 477 self.tk = master.tk 478 self.stylename = self.tk.call('tixDisplayStyle', itemtype, 479 *self._options(cnf,kw) ) 480 481 def __str__(self): 482 return self.stylename 483 484 def _options(self, cnf, kw): 485 if kw and cnf: 486 cnf = _cnfmerge((cnf, kw)) 487 elif kw: 488 cnf = kw 489 opts = () 490 for k, v in cnf.items(): 491 opts = opts + ('-'+k, v) 492 return opts 493 494 def delete(self): 495 self.tk.call(self.stylename, 'delete') 496 497 def __setitem__(self,key,value): 498 self.tk.call(self.stylename, 'configure', '-%s'%key, value) 499 500 def config(self, cnf={}, **kw): 501 return self._getconfigure( 502 self.stylename, 'configure', *self._options(cnf,kw)) 503 504 def __getitem__(self,key): 505 return self.tk.call(self.stylename, 'cget', '-%s'%key) 506 507 508###################################################### 509### The Tix Widget classes - in alphabetical order ### 510###################################################### 511 512class Balloon(TixWidget): 513 """Balloon help widget. 514 515 Subwidget Class 516 --------- ----- 517 label Label 518 message Message""" 519 520 # FIXME: It should inherit -superclass tixShell 521 def __init__(self, master=None, cnf={}, **kw): 522 # static seem to be -installcolormap -initwait -statusbar -cursor 523 static = ['options', 'installcolormap', 'initwait', 'statusbar', 524 'cursor'] 525 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw) 526 self.subwidget_list['label'] = _dummyLabel(self, 'label', 527 destroy_physically=0) 528 self.subwidget_list['message'] = _dummyLabel(self, 'message', 529 destroy_physically=0) 530 531 def bind_widget(self, widget, cnf={}, **kw): 532 """Bind balloon widget to another. 533 One balloon widget may be bound to several widgets at the same time""" 534 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw)) 535 536 def unbind_widget(self, widget): 537 self.tk.call(self._w, 'unbind', widget._w) 538 539class ButtonBox(TixWidget): 540 """ButtonBox - A container for pushbuttons. 541 Subwidgets are the buttons added with the add method. 542 """ 543 def __init__(self, master=None, cnf={}, **kw): 544 TixWidget.__init__(self, master, 'tixButtonBox', 545 ['orientation', 'options'], cnf, kw) 546 547 def add(self, name, cnf={}, **kw): 548 """Add a button with given name to box.""" 549 550 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) 551 self.subwidget_list[name] = _dummyButton(self, name) 552 return btn 553 554 def invoke(self, name): 555 if name in self.subwidget_list: 556 self.tk.call(self._w, 'invoke', name) 557 558class ComboBox(TixWidget): 559 """ComboBox - an Entry field with a dropdown menu. The user can select a 560 choice by either typing in the entry subwidget or selecting from the 561 listbox subwidget. 562 563 Subwidget Class 564 --------- ----- 565 entry Entry 566 arrow Button 567 slistbox ScrolledListBox 568 tick Button 569 cross Button : present if created with the fancy option""" 570 571 # FIXME: It should inherit -superclass tixLabelWidget 572 def __init__ (self, master=None, cnf={}, **kw): 573 TixWidget.__init__(self, master, 'tixComboBox', 574 ['editable', 'dropdown', 'fancy', 'options'], 575 cnf, kw) 576 self.subwidget_list['label'] = _dummyLabel(self, 'label') 577 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') 578 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') 579 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, 580 'slistbox') 581 try: 582 self.subwidget_list['tick'] = _dummyButton(self, 'tick') 583 self.subwidget_list['cross'] = _dummyButton(self, 'cross') 584 except TypeError: 585 # unavailable when -fancy not specified 586 pass 587 588 # align 589 590 def add_history(self, str): 591 self.tk.call(self._w, 'addhistory', str) 592 593 def append_history(self, str): 594 self.tk.call(self._w, 'appendhistory', str) 595 596 def insert(self, index, str): 597 self.tk.call(self._w, 'insert', index, str) 598 599 def pick(self, index): 600 self.tk.call(self._w, 'pick', index) 601 602class Control(TixWidget): 603 """Control - An entry field with value change arrows. The user can 604 adjust the value by pressing the two arrow buttons or by entering 605 the value directly into the entry. The new value will be checked 606 against the user-defined upper and lower limits. 607 608 Subwidget Class 609 --------- ----- 610 incr Button 611 decr Button 612 entry Entry 613 label Label""" 614 615 # FIXME: It should inherit -superclass tixLabelWidget 616 def __init__ (self, master=None, cnf={}, **kw): 617 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw) 618 self.subwidget_list['incr'] = _dummyButton(self, 'incr') 619 self.subwidget_list['decr'] = _dummyButton(self, 'decr') 620 self.subwidget_list['label'] = _dummyLabel(self, 'label') 621 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') 622 623 def decrement(self): 624 self.tk.call(self._w, 'decr') 625 626 def increment(self): 627 self.tk.call(self._w, 'incr') 628 629 def invoke(self): 630 self.tk.call(self._w, 'invoke') 631 632 def update(self): 633 self.tk.call(self._w, 'update') 634 635class DirList(TixWidget): 636 """DirList - displays a list view of a directory, its previous 637 directories and its sub-directories. The user can choose one of 638 the directories displayed in the list or change to another directory. 639 640 Subwidget Class 641 --------- ----- 642 hlist HList 643 hsb Scrollbar 644 vsb Scrollbar""" 645 646 # FIXME: It should inherit -superclass tixScrolledHList 647 def __init__(self, master, cnf={}, **kw): 648 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw) 649 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 650 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 651 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 652 653 def chdir(self, dir): 654 self.tk.call(self._w, 'chdir', dir) 655 656class DirTree(TixWidget): 657 """DirTree - Directory Listing in a hierarchical view. 658 Displays a tree view of a directory, its previous directories and its 659 sub-directories. The user can choose one of the directories displayed 660 in the list or change to another directory. 661 662 Subwidget Class 663 --------- ----- 664 hlist HList 665 hsb Scrollbar 666 vsb Scrollbar""" 667 668 # FIXME: It should inherit -superclass tixScrolledHList 669 def __init__(self, master, cnf={}, **kw): 670 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw) 671 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 672 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 673 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 674 675 def chdir(self, dir): 676 self.tk.call(self._w, 'chdir', dir) 677 678class DirSelectBox(TixWidget): 679 """DirSelectBox - Motif style file select box. 680 It is generally used for 681 the user to choose a file. FileSelectBox stores the files mostly 682 recently selected into a ComboBox widget so that they can be quickly 683 selected again. 684 685 Subwidget Class 686 --------- ----- 687 selection ComboBox 688 filter ComboBox 689 dirlist ScrolledListBox 690 filelist ScrolledListBox""" 691 692 def __init__(self, master, cnf={}, **kw): 693 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw) 694 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') 695 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') 696 697class ExFileSelectBox(TixWidget): 698 """ExFileSelectBox - MS Windows style file select box. 699 It provides a convenient method for the user to select files. 700 701 Subwidget Class 702 --------- ----- 703 cancel Button 704 ok Button 705 hidden Checkbutton 706 types ComboBox 707 dir ComboBox 708 file ComboBox 709 dirlist ScrolledListBox 710 filelist ScrolledListBox""" 711 712 def __init__(self, master, cnf={}, **kw): 713 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw) 714 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') 715 self.subwidget_list['ok'] = _dummyButton(self, 'ok') 716 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden') 717 self.subwidget_list['types'] = _dummyComboBox(self, 'types') 718 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir') 719 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') 720 self.subwidget_list['file'] = _dummyComboBox(self, 'file') 721 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') 722 723 def filter(self): 724 self.tk.call(self._w, 'filter') 725 726 def invoke(self): 727 self.tk.call(self._w, 'invoke') 728 729 730# Should inherit from a Dialog class 731class DirSelectDialog(TixWidget): 732 """The DirSelectDialog widget presents the directories in the file 733 system in a dialog window. The user can use this dialog window to 734 navigate through the file system to select the desired directory. 735 736 Subwidgets Class 737 ---------- ----- 738 dirbox DirSelectDialog""" 739 740 # FIXME: It should inherit -superclass tixDialogShell 741 def __init__(self, master, cnf={}, **kw): 742 TixWidget.__init__(self, master, 'tixDirSelectDialog', 743 ['options'], cnf, kw) 744 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox') 745 # cancel and ok buttons are missing 746 747 def popup(self): 748 self.tk.call(self._w, 'popup') 749 750 def popdown(self): 751 self.tk.call(self._w, 'popdown') 752 753 754# Should inherit from a Dialog class 755class ExFileSelectDialog(TixWidget): 756 """ExFileSelectDialog - MS Windows style file select dialog. 757 It provides a convenient method for the user to select files. 758 759 Subwidgets Class 760 ---------- ----- 761 fsbox ExFileSelectBox""" 762 763 # FIXME: It should inherit -superclass tixDialogShell 764 def __init__(self, master, cnf={}, **kw): 765 TixWidget.__init__(self, master, 'tixExFileSelectDialog', 766 ['options'], cnf, kw) 767 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox') 768 769 def popup(self): 770 self.tk.call(self._w, 'popup') 771 772 def popdown(self): 773 self.tk.call(self._w, 'popdown') 774 775class FileSelectBox(TixWidget): 776 """ExFileSelectBox - Motif style file select box. 777 It is generally used for 778 the user to choose a file. FileSelectBox stores the files mostly 779 recently selected into a ComboBox widget so that they can be quickly 780 selected again. 781 782 Subwidget Class 783 --------- ----- 784 selection ComboBox 785 filter ComboBox 786 dirlist ScrolledListBox 787 filelist ScrolledListBox""" 788 789 def __init__(self, master, cnf={}, **kw): 790 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw) 791 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') 792 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') 793 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') 794 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') 795 796 def apply_filter(self): # name of subwidget is same as command 797 self.tk.call(self._w, 'filter') 798 799 def invoke(self): 800 self.tk.call(self._w, 'invoke') 801 802# Should inherit from a Dialog class 803class FileSelectDialog(TixWidget): 804 """FileSelectDialog - Motif style file select dialog. 805 806 Subwidgets Class 807 ---------- ----- 808 btns StdButtonBox 809 fsbox FileSelectBox""" 810 811 # FIXME: It should inherit -superclass tixStdDialogShell 812 def __init__(self, master, cnf={}, **kw): 813 TixWidget.__init__(self, master, 'tixFileSelectDialog', 814 ['options'], cnf, kw) 815 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns') 816 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox') 817 818 def popup(self): 819 self.tk.call(self._w, 'popup') 820 821 def popdown(self): 822 self.tk.call(self._w, 'popdown') 823 824class FileEntry(TixWidget): 825 """FileEntry - Entry field with button that invokes a FileSelectDialog. 826 The user can type in the filename manually. Alternatively, the user can 827 press the button widget that sits next to the entry, which will bring 828 up a file selection dialog. 829 830 Subwidgets Class 831 ---------- ----- 832 button Button 833 entry Entry""" 834 835 # FIXME: It should inherit -superclass tixLabelWidget 836 def __init__(self, master, cnf={}, **kw): 837 TixWidget.__init__(self, master, 'tixFileEntry', 838 ['dialogtype', 'options'], cnf, kw) 839 self.subwidget_list['button'] = _dummyButton(self, 'button') 840 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') 841 842 def invoke(self): 843 self.tk.call(self._w, 'invoke') 844 845 def file_dialog(self): 846 # FIXME: return python object 847 pass 848 849class HList(TixWidget, XView, YView): 850 """HList - Hierarchy display widget can be used to display any data 851 that have a hierarchical structure, for example, file system directory 852 trees. The list entries are indented and connected by branch lines 853 according to their places in the hierarchy. 854 855 Subwidgets - None""" 856 857 def __init__ (self,master=None,cnf={}, **kw): 858 TixWidget.__init__(self, master, 'tixHList', 859 ['columns', 'options'], cnf, kw) 860 861 def add(self, entry, cnf={}, **kw): 862 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw)) 863 864 def add_child(self, parent=None, cnf={}, **kw): 865 if not parent: 866 parent = '' 867 return self.tk.call( 868 self._w, 'addchild', parent, *self._options(cnf, kw)) 869 870 def anchor_set(self, entry): 871 self.tk.call(self._w, 'anchor', 'set', entry) 872 873 def anchor_clear(self): 874 self.tk.call(self._w, 'anchor', 'clear') 875 876 def column_width(self, col=0, width=None, chars=None): 877 if not chars: 878 return self.tk.call(self._w, 'column', 'width', col, width) 879 else: 880 return self.tk.call(self._w, 'column', 'width', col, 881 '-char', chars) 882 883 def delete_all(self): 884 self.tk.call(self._w, 'delete', 'all') 885 886 def delete_entry(self, entry): 887 self.tk.call(self._w, 'delete', 'entry', entry) 888 889 def delete_offsprings(self, entry): 890 self.tk.call(self._w, 'delete', 'offsprings', entry) 891 892 def delete_siblings(self, entry): 893 self.tk.call(self._w, 'delete', 'siblings', entry) 894 895 def dragsite_set(self, index): 896 self.tk.call(self._w, 'dragsite', 'set', index) 897 898 def dragsite_clear(self): 899 self.tk.call(self._w, 'dragsite', 'clear') 900 901 def dropsite_set(self, index): 902 self.tk.call(self._w, 'dropsite', 'set', index) 903 904 def dropsite_clear(self): 905 self.tk.call(self._w, 'dropsite', 'clear') 906 907 def header_create(self, col, cnf={}, **kw): 908 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw)) 909 910 def header_configure(self, col, cnf={}, **kw): 911 if cnf is None: 912 return self._getconfigure(self._w, 'header', 'configure', col) 913 self.tk.call(self._w, 'header', 'configure', col, 914 *self._options(cnf, kw)) 915 916 def header_cget(self, col, opt): 917 return self.tk.call(self._w, 'header', 'cget', col, opt) 918 919 def header_exists(self, col): 920 # A workaround to Tix library bug (issue #25464). 921 # The documented command is "exists", but only erroneous "exist" is 922 # accepted. 923 return self.tk.getboolean(self.tk.call(self._w, 'header', 'exist', col)) 924 header_exist = header_exists 925 926 def header_delete(self, col): 927 self.tk.call(self._w, 'header', 'delete', col) 928 929 def header_size(self, col): 930 return self.tk.call(self._w, 'header', 'size', col) 931 932 def hide_entry(self, entry): 933 self.tk.call(self._w, 'hide', 'entry', entry) 934 935 def indicator_create(self, entry, cnf={}, **kw): 936 self.tk.call( 937 self._w, 'indicator', 'create', entry, *self._options(cnf, kw)) 938 939 def indicator_configure(self, entry, cnf={}, **kw): 940 if cnf is None: 941 return self._getconfigure( 942 self._w, 'indicator', 'configure', entry) 943 self.tk.call( 944 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw)) 945 946 def indicator_cget(self, entry, opt): 947 return self.tk.call(self._w, 'indicator', 'cget', entry, opt) 948 949 def indicator_exists(self, entry): 950 return self.tk.call (self._w, 'indicator', 'exists', entry) 951 952 def indicator_delete(self, entry): 953 self.tk.call(self._w, 'indicator', 'delete', entry) 954 955 def indicator_size(self, entry): 956 return self.tk.call(self._w, 'indicator', 'size', entry) 957 958 def info_anchor(self): 959 return self.tk.call(self._w, 'info', 'anchor') 960 961 def info_bbox(self, entry): 962 return self._getints( 963 self.tk.call(self._w, 'info', 'bbox', entry)) or None 964 965 def info_children(self, entry=None): 966 c = self.tk.call(self._w, 'info', 'children', entry) 967 return self.tk.splitlist(c) 968 969 def info_data(self, entry): 970 return self.tk.call(self._w, 'info', 'data', entry) 971 972 def info_dragsite(self): 973 return self.tk.call(self._w, 'info', 'dragsite') 974 975 def info_dropsite(self): 976 return self.tk.call(self._w, 'info', 'dropsite') 977 978 def info_exists(self, entry): 979 return self.tk.call(self._w, 'info', 'exists', entry) 980 981 def info_hidden(self, entry): 982 return self.tk.call(self._w, 'info', 'hidden', entry) 983 984 def info_next(self, entry): 985 return self.tk.call(self._w, 'info', 'next', entry) 986 987 def info_parent(self, entry): 988 return self.tk.call(self._w, 'info', 'parent', entry) 989 990 def info_prev(self, entry): 991 return self.tk.call(self._w, 'info', 'prev', entry) 992 993 def info_selection(self): 994 c = self.tk.call(self._w, 'info', 'selection') 995 return self.tk.splitlist(c) 996 997 def item_cget(self, entry, col, opt): 998 return self.tk.call(self._w, 'item', 'cget', entry, col, opt) 999 1000 def item_configure(self, entry, col, cnf={}, **kw): 1001 if cnf is None: 1002 return self._getconfigure(self._w, 'item', 'configure', entry, col) 1003 self.tk.call(self._w, 'item', 'configure', entry, col, 1004 *self._options(cnf, kw)) 1005 1006 def item_create(self, entry, col, cnf={}, **kw): 1007 self.tk.call( 1008 self._w, 'item', 'create', entry, col, *self._options(cnf, kw)) 1009 1010 def item_exists(self, entry, col): 1011 return self.tk.call(self._w, 'item', 'exists', entry, col) 1012 1013 def item_delete(self, entry, col): 1014 self.tk.call(self._w, 'item', 'delete', entry, col) 1015 1016 def entrycget(self, entry, opt): 1017 return self.tk.call(self._w, 'entrycget', entry, opt) 1018 1019 def entryconfigure(self, entry, cnf={}, **kw): 1020 if cnf is None: 1021 return self._getconfigure(self._w, 'entryconfigure', entry) 1022 self.tk.call(self._w, 'entryconfigure', entry, 1023 *self._options(cnf, kw)) 1024 1025 def nearest(self, y): 1026 return self.tk.call(self._w, 'nearest', y) 1027 1028 def see(self, entry): 1029 self.tk.call(self._w, 'see', entry) 1030 1031 def selection_clear(self, cnf={}, **kw): 1032 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw)) 1033 1034 def selection_includes(self, entry): 1035 return self.tk.call(self._w, 'selection', 'includes', entry) 1036 1037 def selection_set(self, first, last=None): 1038 self.tk.call(self._w, 'selection', 'set', first, last) 1039 1040 def show_entry(self, entry): 1041 return self.tk.call(self._w, 'show', 'entry', entry) 1042 1043class InputOnly(TixWidget): 1044 """InputOnly - Invisible widget. Unix only. 1045 1046 Subwidgets - None""" 1047 1048 def __init__ (self,master=None,cnf={}, **kw): 1049 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw) 1050 1051class LabelEntry(TixWidget): 1052 """LabelEntry - Entry field with label. Packages an entry widget 1053 and a label into one mega widget. It can be used to simplify the creation 1054 of ``entry-form'' type of interface. 1055 1056 Subwidgets Class 1057 ---------- ----- 1058 label Label 1059 entry Entry""" 1060 1061 def __init__ (self,master=None,cnf={}, **kw): 1062 TixWidget.__init__(self, master, 'tixLabelEntry', 1063 ['labelside','options'], cnf, kw) 1064 self.subwidget_list['label'] = _dummyLabel(self, 'label') 1065 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') 1066 1067class LabelFrame(TixWidget): 1068 """LabelFrame - Labelled Frame container. Packages a frame widget 1069 and a label into one mega widget. To create widgets inside a 1070 LabelFrame widget, one creates the new widgets relative to the 1071 frame subwidget and manage them inside the frame subwidget. 1072 1073 Subwidgets Class 1074 ---------- ----- 1075 label Label 1076 frame Frame""" 1077 1078 def __init__ (self,master=None,cnf={}, **kw): 1079 TixWidget.__init__(self, master, 'tixLabelFrame', 1080 ['labelside','options'], cnf, kw) 1081 self.subwidget_list['label'] = _dummyLabel(self, 'label') 1082 self.subwidget_list['frame'] = _dummyFrame(self, 'frame') 1083 1084 1085class ListNoteBook(TixWidget): 1086 """A ListNoteBook widget is very similar to the TixNoteBook widget: 1087 it can be used to display many windows in a limited space using a 1088 notebook metaphor. The notebook is divided into a stack of pages 1089 (windows). At one time only one of these pages can be shown. 1090 The user can navigate through these pages by 1091 choosing the name of the desired page in the hlist subwidget.""" 1092 1093 def __init__(self, master, cnf={}, **kw): 1094 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw) 1095 # Is this necessary? It's not an exposed subwidget in Tix. 1096 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane', 1097 destroy_physically=0) 1098 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 1099 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist') 1100 1101 def add(self, name, cnf={}, **kw): 1102 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) 1103 self.subwidget_list[name] = TixSubWidget(self, name) 1104 return self.subwidget_list[name] 1105 1106 def page(self, name): 1107 return self.subwidget(name) 1108 1109 def pages(self): 1110 # Can't call subwidgets_all directly because we don't want .nbframe 1111 names = self.tk.splitlist(self.tk.call(self._w, 'pages')) 1112 ret = [] 1113 for x in names: 1114 ret.append(self.subwidget(x)) 1115 return ret 1116 1117 def raise_page(self, name): # raise is a python keyword 1118 self.tk.call(self._w, 'raise', name) 1119 1120class Meter(TixWidget): 1121 """The Meter widget can be used to show the progress of a background 1122 job which may take a long time to execute. 1123 """ 1124 1125 def __init__(self, master=None, cnf={}, **kw): 1126 TixWidget.__init__(self, master, 'tixMeter', 1127 ['options'], cnf, kw) 1128 1129class NoteBook(TixWidget): 1130 """NoteBook - Multi-page container widget (tabbed notebook metaphor). 1131 1132 Subwidgets Class 1133 ---------- ----- 1134 nbframe NoteBookFrame 1135 <pages> page widgets added dynamically with the add method""" 1136 1137 def __init__ (self,master=None,cnf={}, **kw): 1138 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw) 1139 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe', 1140 destroy_physically=0) 1141 1142 def add(self, name, cnf={}, **kw): 1143 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) 1144 self.subwidget_list[name] = TixSubWidget(self, name) 1145 return self.subwidget_list[name] 1146 1147 def delete(self, name): 1148 self.tk.call(self._w, 'delete', name) 1149 self.subwidget_list[name].destroy() 1150 del self.subwidget_list[name] 1151 1152 def page(self, name): 1153 return self.subwidget(name) 1154 1155 def pages(self): 1156 # Can't call subwidgets_all directly because we don't want .nbframe 1157 names = self.tk.splitlist(self.tk.call(self._w, 'pages')) 1158 ret = [] 1159 for x in names: 1160 ret.append(self.subwidget(x)) 1161 return ret 1162 1163 def raise_page(self, name): # raise is a python keyword 1164 self.tk.call(self._w, 'raise', name) 1165 1166 def raised(self): 1167 return self.tk.call(self._w, 'raised') 1168 1169class NoteBookFrame(TixWidget): 1170 # FIXME: This is dangerous to expose to be called on its own. 1171 pass 1172 1173class OptionMenu(TixWidget): 1174 """OptionMenu - creates a menu button of options. 1175 1176 Subwidget Class 1177 --------- ----- 1178 menubutton Menubutton 1179 menu Menu""" 1180 1181 def __init__(self, master, cnf={}, **kw): 1182 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw) 1183 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton') 1184 self.subwidget_list['menu'] = _dummyMenu(self, 'menu') 1185 1186 def add_command(self, name, cnf={}, **kw): 1187 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw)) 1188 1189 def add_separator(self, name, cnf={}, **kw): 1190 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw)) 1191 1192 def delete(self, name): 1193 self.tk.call(self._w, 'delete', name) 1194 1195 def disable(self, name): 1196 self.tk.call(self._w, 'disable', name) 1197 1198 def enable(self, name): 1199 self.tk.call(self._w, 'enable', name) 1200 1201class PanedWindow(TixWidget): 1202 """PanedWindow - Multi-pane container widget 1203 allows the user to interactively manipulate the sizes of several 1204 panes. The panes can be arranged either vertically or horizontally.The 1205 user changes the sizes of the panes by dragging the resize handle 1206 between two panes. 1207 1208 Subwidgets Class 1209 ---------- ----- 1210 <panes> g/p widgets added dynamically with the add method.""" 1211 1212 def __init__(self, master, cnf={}, **kw): 1213 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw) 1214 1215 # add delete forget panecget paneconfigure panes setsize 1216 def add(self, name, cnf={}, **kw): 1217 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) 1218 self.subwidget_list[name] = TixSubWidget(self, name, 1219 check_intermediate=0) 1220 return self.subwidget_list[name] 1221 1222 def delete(self, name): 1223 self.tk.call(self._w, 'delete', name) 1224 self.subwidget_list[name].destroy() 1225 del self.subwidget_list[name] 1226 1227 def forget(self, name): 1228 self.tk.call(self._w, 'forget', name) 1229 1230 def panecget(self, entry, opt): 1231 return self.tk.call(self._w, 'panecget', entry, opt) 1232 1233 def paneconfigure(self, entry, cnf={}, **kw): 1234 if cnf is None: 1235 return self._getconfigure(self._w, 'paneconfigure', entry) 1236 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw)) 1237 1238 def panes(self): 1239 names = self.tk.splitlist(self.tk.call(self._w, 'panes')) 1240 return [self.subwidget(x) for x in names] 1241 1242class PopupMenu(TixWidget): 1243 """PopupMenu widget can be used as a replacement of the tk_popup command. 1244 The advantage of the Tix PopupMenu widget is it requires less application 1245 code to manipulate. 1246 1247 1248 Subwidgets Class 1249 ---------- ----- 1250 menubutton Menubutton 1251 menu Menu""" 1252 1253 # FIXME: It should inherit -superclass tixShell 1254 def __init__(self, master, cnf={}, **kw): 1255 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw) 1256 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton') 1257 self.subwidget_list['menu'] = _dummyMenu(self, 'menu') 1258 1259 def bind_widget(self, widget): 1260 self.tk.call(self._w, 'bind', widget._w) 1261 1262 def unbind_widget(self, widget): 1263 self.tk.call(self._w, 'unbind', widget._w) 1264 1265 def post_widget(self, widget, x, y): 1266 self.tk.call(self._w, 'post', widget._w, x, y) 1267 1268class ResizeHandle(TixWidget): 1269 """Internal widget to draw resize handles on Scrolled widgets.""" 1270 def __init__(self, master, cnf={}, **kw): 1271 # There seems to be a Tix bug rejecting the configure method 1272 # Let's try making the flags -static 1273 flags = ['options', 'command', 'cursorfg', 'cursorbg', 1274 'handlesize', 'hintcolor', 'hintwidth', 1275 'x', 'y'] 1276 # In fact, x y height width are configurable 1277 TixWidget.__init__(self, master, 'tixResizeHandle', 1278 flags, cnf, kw) 1279 1280 def attach_widget(self, widget): 1281 self.tk.call(self._w, 'attachwidget', widget._w) 1282 1283 def detach_widget(self, widget): 1284 self.tk.call(self._w, 'detachwidget', widget._w) 1285 1286 def hide(self, widget): 1287 self.tk.call(self._w, 'hide', widget._w) 1288 1289 def show(self, widget): 1290 self.tk.call(self._w, 'show', widget._w) 1291 1292class ScrolledHList(TixWidget): 1293 """ScrolledHList - HList with automatic scrollbars.""" 1294 1295 # FIXME: It should inherit -superclass tixScrolledWidget 1296 def __init__(self, master, cnf={}, **kw): 1297 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'], 1298 cnf, kw) 1299 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 1300 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1301 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1302 1303class ScrolledListBox(TixWidget): 1304 """ScrolledListBox - Listbox with automatic scrollbars.""" 1305 1306 # FIXME: It should inherit -superclass tixScrolledWidget 1307 def __init__(self, master, cnf={}, **kw): 1308 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw) 1309 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox') 1310 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1311 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1312 1313class ScrolledText(TixWidget): 1314 """ScrolledText - Text with automatic scrollbars.""" 1315 1316 # FIXME: It should inherit -superclass tixScrolledWidget 1317 def __init__(self, master, cnf={}, **kw): 1318 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw) 1319 self.subwidget_list['text'] = _dummyText(self, 'text') 1320 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1321 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1322 1323class ScrolledTList(TixWidget): 1324 """ScrolledTList - TList with automatic scrollbars.""" 1325 1326 # FIXME: It should inherit -superclass tixScrolledWidget 1327 def __init__(self, master, cnf={}, **kw): 1328 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'], 1329 cnf, kw) 1330 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist') 1331 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1332 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1333 1334class ScrolledWindow(TixWidget): 1335 """ScrolledWindow - Window with automatic scrollbars.""" 1336 1337 # FIXME: It should inherit -superclass tixScrolledWidget 1338 def __init__(self, master, cnf={}, **kw): 1339 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw) 1340 self.subwidget_list['window'] = _dummyFrame(self, 'window') 1341 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1342 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1343 1344class Select(TixWidget): 1345 """Select - Container of button subwidgets. It can be used to provide 1346 radio-box or check-box style of selection options for the user. 1347 1348 Subwidgets are buttons added dynamically using the add method.""" 1349 1350 # FIXME: It should inherit -superclass tixLabelWidget 1351 def __init__(self, master, cnf={}, **kw): 1352 TixWidget.__init__(self, master, 'tixSelect', 1353 ['allowzero', 'radio', 'orientation', 'labelside', 1354 'options'], 1355 cnf, kw) 1356 self.subwidget_list['label'] = _dummyLabel(self, 'label') 1357 1358 def add(self, name, cnf={}, **kw): 1359 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) 1360 self.subwidget_list[name] = _dummyButton(self, name) 1361 return self.subwidget_list[name] 1362 1363 def invoke(self, name): 1364 self.tk.call(self._w, 'invoke', name) 1365 1366class Shell(TixWidget): 1367 """Toplevel window. 1368 1369 Subwidgets - None""" 1370 1371 def __init__ (self,master=None,cnf={}, **kw): 1372 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw) 1373 1374class DialogShell(TixWidget): 1375 """Toplevel window, with popup popdown and center methods. 1376 It tells the window manager that it is a dialog window and should be 1377 treated specially. The exact treatment depends on the treatment of 1378 the window manager. 1379 1380 Subwidgets - None""" 1381 1382 # FIXME: It should inherit from Shell 1383 def __init__ (self,master=None,cnf={}, **kw): 1384 TixWidget.__init__(self, master, 1385 'tixDialogShell', 1386 ['options', 'title', 'mapped', 1387 'minheight', 'minwidth', 1388 'parent', 'transient'], cnf, kw) 1389 1390 def popdown(self): 1391 self.tk.call(self._w, 'popdown') 1392 1393 def popup(self): 1394 self.tk.call(self._w, 'popup') 1395 1396 def center(self): 1397 self.tk.call(self._w, 'center') 1398 1399class StdButtonBox(TixWidget): 1400 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """ 1401 1402 def __init__(self, master=None, cnf={}, **kw): 1403 TixWidget.__init__(self, master, 'tixStdButtonBox', 1404 ['orientation', 'options'], cnf, kw) 1405 self.subwidget_list['ok'] = _dummyButton(self, 'ok') 1406 self.subwidget_list['apply'] = _dummyButton(self, 'apply') 1407 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') 1408 self.subwidget_list['help'] = _dummyButton(self, 'help') 1409 1410 def invoke(self, name): 1411 if name in self.subwidget_list: 1412 self.tk.call(self._w, 'invoke', name) 1413 1414class TList(TixWidget, XView, YView): 1415 """TList - Hierarchy display widget which can be 1416 used to display data in a tabular format. The list entries of a TList 1417 widget are similar to the entries in the Tk listbox widget. The main 1418 differences are (1) the TList widget can display the list entries in a 1419 two dimensional format and (2) you can use graphical images as well as 1420 multiple colors and fonts for the list entries. 1421 1422 Subwidgets - None""" 1423 1424 def __init__ (self,master=None,cnf={}, **kw): 1425 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw) 1426 1427 def active_set(self, index): 1428 self.tk.call(self._w, 'active', 'set', index) 1429 1430 def active_clear(self): 1431 self.tk.call(self._w, 'active', 'clear') 1432 1433 def anchor_set(self, index): 1434 self.tk.call(self._w, 'anchor', 'set', index) 1435 1436 def anchor_clear(self): 1437 self.tk.call(self._w, 'anchor', 'clear') 1438 1439 def delete(self, from_, to=None): 1440 self.tk.call(self._w, 'delete', from_, to) 1441 1442 def dragsite_set(self, index): 1443 self.tk.call(self._w, 'dragsite', 'set', index) 1444 1445 def dragsite_clear(self): 1446 self.tk.call(self._w, 'dragsite', 'clear') 1447 1448 def dropsite_set(self, index): 1449 self.tk.call(self._w, 'dropsite', 'set', index) 1450 1451 def dropsite_clear(self): 1452 self.tk.call(self._w, 'dropsite', 'clear') 1453 1454 def insert(self, index, cnf={}, **kw): 1455 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw)) 1456 1457 def info_active(self): 1458 return self.tk.call(self._w, 'info', 'active') 1459 1460 def info_anchor(self): 1461 return self.tk.call(self._w, 'info', 'anchor') 1462 1463 def info_down(self, index): 1464 return self.tk.call(self._w, 'info', 'down', index) 1465 1466 def info_left(self, index): 1467 return self.tk.call(self._w, 'info', 'left', index) 1468 1469 def info_right(self, index): 1470 return self.tk.call(self._w, 'info', 'right', index) 1471 1472 def info_selection(self): 1473 c = self.tk.call(self._w, 'info', 'selection') 1474 return self.tk.splitlist(c) 1475 1476 def info_size(self): 1477 return self.tk.call(self._w, 'info', 'size') 1478 1479 def info_up(self, index): 1480 return self.tk.call(self._w, 'info', 'up', index) 1481 1482 def nearest(self, x, y): 1483 return self.tk.call(self._w, 'nearest', x, y) 1484 1485 def see(self, index): 1486 self.tk.call(self._w, 'see', index) 1487 1488 def selection_clear(self, cnf={}, **kw): 1489 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw)) 1490 1491 def selection_includes(self, index): 1492 return self.tk.call(self._w, 'selection', 'includes', index) 1493 1494 def selection_set(self, first, last=None): 1495 self.tk.call(self._w, 'selection', 'set', first, last) 1496 1497class Tree(TixWidget): 1498 """Tree - The tixTree widget can be used to display hierarchical 1499 data in a tree form. The user can adjust 1500 the view of the tree by opening or closing parts of the tree.""" 1501 1502 # FIXME: It should inherit -superclass tixScrolledWidget 1503 def __init__(self, master=None, cnf={}, **kw): 1504 TixWidget.__init__(self, master, 'tixTree', 1505 ['options'], cnf, kw) 1506 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 1507 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1508 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1509 1510 def autosetmode(self): 1511 '''This command calls the setmode method for all the entries in this 1512 Tree widget: if an entry has no child entries, its mode is set to 1513 none. Otherwise, if the entry has any hidden child entries, its mode is 1514 set to open; otherwise its mode is set to close.''' 1515 self.tk.call(self._w, 'autosetmode') 1516 1517 def close(self, entrypath): 1518 '''Close the entry given by entryPath if its mode is close.''' 1519 self.tk.call(self._w, 'close', entrypath) 1520 1521 def getmode(self, entrypath): 1522 '''Returns the current mode of the entry given by entryPath.''' 1523 return self.tk.call(self._w, 'getmode', entrypath) 1524 1525 def open(self, entrypath): 1526 '''Open the entry given by entryPath if its mode is open.''' 1527 self.tk.call(self._w, 'open', entrypath) 1528 1529 def setmode(self, entrypath, mode='none'): 1530 '''This command is used to indicate whether the entry given by 1531 entryPath has children entries and whether the children are visible. mode 1532 must be one of open, close or none. If mode is set to open, a (+) 1533 indicator is drawn next the entry. If mode is set to close, a (-) 1534 indicator is drawn next the entry. If mode is set to none, no 1535 indicators will be drawn for this entry. The default mode is none. The 1536 open mode indicates the entry has hidden children and this entry can be 1537 opened by the user. The close mode indicates that all the children of the 1538 entry are now visible and the entry can be closed by the user.''' 1539 self.tk.call(self._w, 'setmode', entrypath, mode) 1540 1541 1542# Could try subclassing Tree for CheckList - would need another arg to init 1543class CheckList(TixWidget): 1544 """The CheckList widget 1545 displays a list of items to be selected by the user. CheckList acts 1546 similarly to the Tk checkbutton or radiobutton widgets, except it is 1547 capable of handling many more items than checkbuttons or radiobuttons. 1548 """ 1549 # FIXME: It should inherit -superclass tixTree 1550 def __init__(self, master=None, cnf={}, **kw): 1551 TixWidget.__init__(self, master, 'tixCheckList', 1552 ['options', 'radio'], cnf, kw) 1553 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 1554 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1555 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1556 1557 def autosetmode(self): 1558 '''This command calls the setmode method for all the entries in this 1559 Tree widget: if an entry has no child entries, its mode is set to 1560 none. Otherwise, if the entry has any hidden child entries, its mode is 1561 set to open; otherwise its mode is set to close.''' 1562 self.tk.call(self._w, 'autosetmode') 1563 1564 def close(self, entrypath): 1565 '''Close the entry given by entryPath if its mode is close.''' 1566 self.tk.call(self._w, 'close', entrypath) 1567 1568 def getmode(self, entrypath): 1569 '''Returns the current mode of the entry given by entryPath.''' 1570 return self.tk.call(self._w, 'getmode', entrypath) 1571 1572 def open(self, entrypath): 1573 '''Open the entry given by entryPath if its mode is open.''' 1574 self.tk.call(self._w, 'open', entrypath) 1575 1576 def getselection(self, mode='on'): 1577 '''Returns a list of items whose status matches status. If status is 1578 not specified, the list of items in the "on" status will be returned. 1579 Mode can be on, off, default''' 1580 return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode)) 1581 1582 def getstatus(self, entrypath): 1583 '''Returns the current status of entryPath.''' 1584 return self.tk.call(self._w, 'getstatus', entrypath) 1585 1586 def setstatus(self, entrypath, mode='on'): 1587 '''Sets the status of entryPath to be status. A bitmap will be 1588 displayed next to the entry its status is on, off or default.''' 1589 self.tk.call(self._w, 'setstatus', entrypath, mode) 1590 1591 1592########################################################################### 1593### The subclassing below is used to instantiate the subwidgets in each ### 1594### mega widget. This allows us to access their methods directly. ### 1595########################################################################### 1596 1597class _dummyButton(Button, TixSubWidget): 1598 def __init__(self, master, name, destroy_physically=1): 1599 TixSubWidget.__init__(self, master, name, destroy_physically) 1600 1601class _dummyCheckbutton(Checkbutton, TixSubWidget): 1602 def __init__(self, master, name, destroy_physically=1): 1603 TixSubWidget.__init__(self, master, name, destroy_physically) 1604 1605class _dummyEntry(Entry, TixSubWidget): 1606 def __init__(self, master, name, destroy_physically=1): 1607 TixSubWidget.__init__(self, master, name, destroy_physically) 1608 1609class _dummyFrame(Frame, TixSubWidget): 1610 def __init__(self, master, name, destroy_physically=1): 1611 TixSubWidget.__init__(self, master, name, destroy_physically) 1612 1613class _dummyLabel(Label, TixSubWidget): 1614 def __init__(self, master, name, destroy_physically=1): 1615 TixSubWidget.__init__(self, master, name, destroy_physically) 1616 1617class _dummyListbox(Listbox, TixSubWidget): 1618 def __init__(self, master, name, destroy_physically=1): 1619 TixSubWidget.__init__(self, master, name, destroy_physically) 1620 1621class _dummyMenu(Menu, TixSubWidget): 1622 def __init__(self, master, name, destroy_physically=1): 1623 TixSubWidget.__init__(self, master, name, destroy_physically) 1624 1625class _dummyMenubutton(Menubutton, TixSubWidget): 1626 def __init__(self, master, name, destroy_physically=1): 1627 TixSubWidget.__init__(self, master, name, destroy_physically) 1628 1629class _dummyScrollbar(Scrollbar, TixSubWidget): 1630 def __init__(self, master, name, destroy_physically=1): 1631 TixSubWidget.__init__(self, master, name, destroy_physically) 1632 1633class _dummyText(Text, TixSubWidget): 1634 def __init__(self, master, name, destroy_physically=1): 1635 TixSubWidget.__init__(self, master, name, destroy_physically) 1636 1637class _dummyScrolledListBox(ScrolledListBox, TixSubWidget): 1638 def __init__(self, master, name, destroy_physically=1): 1639 TixSubWidget.__init__(self, master, name, destroy_physically) 1640 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox') 1641 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1642 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1643 1644class _dummyHList(HList, TixSubWidget): 1645 def __init__(self, master, name, destroy_physically=1): 1646 TixSubWidget.__init__(self, master, name, destroy_physically) 1647 1648class _dummyScrolledHList(ScrolledHList, TixSubWidget): 1649 def __init__(self, master, name, destroy_physically=1): 1650 TixSubWidget.__init__(self, master, name, destroy_physically) 1651 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 1652 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1653 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1654 1655class _dummyTList(TList, TixSubWidget): 1656 def __init__(self, master, name, destroy_physically=1): 1657 TixSubWidget.__init__(self, master, name, destroy_physically) 1658 1659class _dummyComboBox(ComboBox, TixSubWidget): 1660 def __init__(self, master, name, destroy_physically=1): 1661 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically]) 1662 self.subwidget_list['label'] = _dummyLabel(self, 'label') 1663 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') 1664 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') 1665 1666 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, 1667 'slistbox') 1668 try: 1669 self.subwidget_list['tick'] = _dummyButton(self, 'tick') 1670 #cross Button : present if created with the fancy option 1671 self.subwidget_list['cross'] = _dummyButton(self, 'cross') 1672 except TypeError: 1673 # unavailable when -fancy not specified 1674 pass 1675 1676class _dummyDirList(DirList, TixSubWidget): 1677 def __init__(self, master, name, destroy_physically=1): 1678 TixSubWidget.__init__(self, master, name, destroy_physically) 1679 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') 1680 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') 1681 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') 1682 1683class _dummyDirSelectBox(DirSelectBox, TixSubWidget): 1684 def __init__(self, master, name, destroy_physically=1): 1685 TixSubWidget.__init__(self, master, name, destroy_physically) 1686 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') 1687 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') 1688 1689class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget): 1690 def __init__(self, master, name, destroy_physically=1): 1691 TixSubWidget.__init__(self, master, name, destroy_physically) 1692 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') 1693 self.subwidget_list['ok'] = _dummyButton(self, 'ok') 1694 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden') 1695 self.subwidget_list['types'] = _dummyComboBox(self, 'types') 1696 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir') 1697 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') 1698 self.subwidget_list['file'] = _dummyComboBox(self, 'file') 1699 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') 1700 1701class _dummyFileSelectBox(FileSelectBox, TixSubWidget): 1702 def __init__(self, master, name, destroy_physically=1): 1703 TixSubWidget.__init__(self, master, name, destroy_physically) 1704 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') 1705 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') 1706 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') 1707 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') 1708 1709class _dummyFileComboBox(ComboBox, TixSubWidget): 1710 def __init__(self, master, name, destroy_physically=1): 1711 TixSubWidget.__init__(self, master, name, destroy_physically) 1712 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx') 1713 1714class _dummyStdButtonBox(StdButtonBox, TixSubWidget): 1715 def __init__(self, master, name, destroy_physically=1): 1716 TixSubWidget.__init__(self, master, name, destroy_physically) 1717 self.subwidget_list['ok'] = _dummyButton(self, 'ok') 1718 self.subwidget_list['apply'] = _dummyButton(self, 'apply') 1719 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') 1720 self.subwidget_list['help'] = _dummyButton(self, 'help') 1721 1722class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget): 1723 def __init__(self, master, name, destroy_physically=0): 1724 TixSubWidget.__init__(self, master, name, destroy_physically) 1725 1726class _dummyPanedWindow(PanedWindow, TixSubWidget): 1727 def __init__(self, master, name, destroy_physically=1): 1728 TixSubWidget.__init__(self, master, name, destroy_physically) 1729 1730######################## 1731### Utility Routines ### 1732######################## 1733 1734#mike Should tixDestroy be exposed as a wrapper? - but not for widgets. 1735 1736def OptionName(widget): 1737 '''Returns the qualified path name for the widget. Normally used to set 1738 default options for subwidgets. See tixwidgets.py''' 1739 return widget.tk.call('tixOptionName', widget._w) 1740 1741# Called with a dictionary argument of the form 1742# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'} 1743# returns a string which can be used to configure the fsbox file types 1744# in an ExFileSelectBox. i.e., 1745# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}' 1746def FileTypeList(dict): 1747 s = '' 1748 for type in dict.keys(): 1749 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} ' 1750 return s 1751 1752# Still to be done: 1753# tixIconView 1754class CObjView(TixWidget): 1755 """This file implements the Canvas Object View widget. This is a base 1756 class of IconView. It implements automatic placement/adjustment of the 1757 scrollbars according to the canvas objects inside the canvas subwidget. 1758 The scrollbars are adjusted so that the canvas is just large enough 1759 to see all the objects. 1760 """ 1761 # FIXME: It should inherit -superclass tixScrolledWidget 1762 pass 1763 1764 1765class Grid(TixWidget, XView, YView): 1766 '''The Tix Grid command creates a new window and makes it into a 1767 tixGrid widget. Additional options, may be specified on the command 1768 line or in the option database to configure aspects such as its cursor 1769 and relief. 1770 1771 A Grid widget displays its contents in a two dimensional grid of cells. 1772 Each cell may contain one Tix display item, which may be in text, 1773 graphics or other formats. See the DisplayStyle class for more information 1774 about Tix display items. Individual cells, or groups of cells, can be 1775 formatted with a wide range of attributes, such as its color, relief and 1776 border. 1777 1778 Subwidgets - None''' 1779 # valid specific resources as of Tk 8.4 1780 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd, 1781 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode, 1782 # selectunit, topmargin, 1783 def __init__(self, master=None, cnf={}, **kw): 1784 static= [] 1785 self.cnf= cnf 1786 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw) 1787 1788 # valid options as of Tk 8.4 1789 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget, 1790 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest, 1791 # selection, set, size, unset, xview, yview 1792 def anchor_clear(self): 1793 """Removes the selection anchor.""" 1794 self.tk.call(self, 'anchor', 'clear') 1795 1796 def anchor_get(self): 1797 "Get the (x,y) coordinate of the current anchor cell" 1798 return self._getints(self.tk.call(self, 'anchor', 'get')) 1799 1800 def anchor_set(self, x, y): 1801 """Set the selection anchor to the cell at (x, y).""" 1802 self.tk.call(self, 'anchor', 'set', x, y) 1803 1804 def delete_row(self, from_, to=None): 1805 """Delete rows between from_ and to inclusive. 1806 If to is not provided, delete only row at from_""" 1807 if to is None: 1808 self.tk.call(self, 'delete', 'row', from_) 1809 else: 1810 self.tk.call(self, 'delete', 'row', from_, to) 1811 1812 def delete_column(self, from_, to=None): 1813 """Delete columns between from_ and to inclusive. 1814 If to is not provided, delete only column at from_""" 1815 if to is None: 1816 self.tk.call(self, 'delete', 'column', from_) 1817 else: 1818 self.tk.call(self, 'delete', 'column', from_, to) 1819 1820 def edit_apply(self): 1821 """If any cell is being edited, de-highlight the cell and applies 1822 the changes.""" 1823 self.tk.call(self, 'edit', 'apply') 1824 1825 def edit_set(self, x, y): 1826 """Highlights the cell at (x, y) for editing, if the -editnotify 1827 command returns True for this cell.""" 1828 self.tk.call(self, 'edit', 'set', x, y) 1829 1830 def entrycget(self, x, y, option): 1831 "Get the option value for cell at (x,y)" 1832 if option and option[0] != '-': 1833 option = '-' + option 1834 return self.tk.call(self, 'entrycget', x, y, option) 1835 1836 def entryconfigure(self, x, y, cnf=None, **kw): 1837 return self._configure(('entryconfigure', x, y), cnf, kw) 1838 1839 # def format 1840 # def index 1841 1842 def info_exists(self, x, y): 1843 "Return True if display item exists at (x,y)" 1844 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y)) 1845 1846 def info_bbox(self, x, y): 1847 # This seems to always return '', at least for 'text' displayitems 1848 return self.tk.call(self, 'info', 'bbox', x, y) 1849 1850 def move_column(self, from_, to, offset): 1851 """Moves the range of columns from position FROM through TO by 1852 the distance indicated by OFFSET. For example, move_column(2, 4, 1) 1853 moves the columns 2,3,4 to columns 3,4,5.""" 1854 self.tk.call(self, 'move', 'column', from_, to, offset) 1855 1856 def move_row(self, from_, to, offset): 1857 """Moves the range of rows from position FROM through TO by 1858 the distance indicated by OFFSET. 1859 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.""" 1860 self.tk.call(self, 'move', 'row', from_, to, offset) 1861 1862 def nearest(self, x, y): 1863 "Return coordinate of cell nearest pixel coordinate (x,y)" 1864 return self._getints(self.tk.call(self, 'nearest', x, y)) 1865 1866 # def selection adjust 1867 # def selection clear 1868 # def selection includes 1869 # def selection set 1870 # def selection toggle 1871 1872 def set(self, x, y, itemtype=None, **kw): 1873 args= self._options(self.cnf, kw) 1874 if itemtype is not None: 1875 args= ('-itemtype', itemtype) + args 1876 self.tk.call(self, 'set', x, y, *args) 1877 1878 def size_column(self, index, **kw): 1879 """Queries or sets the size of the column given by 1880 INDEX. INDEX may be any non-negative 1881 integer that gives the position of a given column. 1882 INDEX can also be the string "default"; in this case, this command 1883 queries or sets the default size of all columns. 1884 When no option-value pair is given, this command returns a tuple 1885 containing the current size setting of the given column. When 1886 option-value pairs are given, the corresponding options of the 1887 size setting of the given column are changed. Options may be one 1888 of the following: 1889 pad0 pixels 1890 Specifies the paddings to the left of a column. 1891 pad1 pixels 1892 Specifies the paddings to the right of a column. 1893 size val 1894 Specifies the width of a column. Val may be: 1895 "auto" -- the width of the column is set to the 1896 width of the widest cell in the column; 1897 a valid Tk screen distance unit; 1898 or a real number following by the word chars 1899 (e.g. 3.4chars) that sets the width of the column to the 1900 given number of characters.""" 1901 return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index, 1902 *self._options({}, kw))) 1903 1904 def size_row(self, index, **kw): 1905 """Queries or sets the size of the row given by 1906 INDEX. INDEX may be any non-negative 1907 integer that gives the position of a given row . 1908 INDEX can also be the string "default"; in this case, this command 1909 queries or sets the default size of all rows. 1910 When no option-value pair is given, this command returns a list con- 1911 taining the current size setting of the given row . When option-value 1912 pairs are given, the corresponding options of the size setting of the 1913 given row are changed. Options may be one of the following: 1914 pad0 pixels 1915 Specifies the paddings to the top of a row. 1916 pad1 pixels 1917 Specifies the paddings to the bottom of a row. 1918 size val 1919 Specifies the height of a row. Val may be: 1920 "auto" -- the height of the row is set to the 1921 height of the highest cell in the row; 1922 a valid Tk screen distance unit; 1923 or a real number following by the word chars 1924 (e.g. 3.4chars) that sets the height of the row to the 1925 given number of characters.""" 1926 return self.tk.splitlist(self.tk.call( 1927 self, 'size', 'row', index, *self._options({}, kw))) 1928 1929 def unset(self, x, y): 1930 """Clears the cell at (x, y) by removing its display item.""" 1931 self.tk.call(self._w, 'unset', x, y) 1932 1933 1934class ScrolledGrid(Grid): 1935 '''Scrolled Grid widgets''' 1936 1937 # FIXME: It should inherit -superclass tixScrolledWidget 1938 def __init__(self, master=None, cnf={}, **kw): 1939 static= [] 1940 self.cnf= cnf 1941 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw) 1942