1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
# (C) Copyright 2005-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Grid example.
This is currently only supported by the WxPython toolkit.
"""
import os
from traits.api import Float, Str
from traits.observation.api import match
from pyface.api import GUI, PythonShell, SplitApplicationWindow
from pyface.ui.wx.grid.api import (
Grid,
TraitGridModel,
GridRow,
GridColumn,
TraitGridColumn,
)
from file_tree import FileTree
class MainWindow(SplitApplicationWindow):
""" The main application window. """
# 'SplitApplicationWindow' interface -----------------------------------
# The ratio of the size of the left/top pane to the right/bottom pane.
ratio = Float(0.3)
# The direction in which the window is split.
direction = Str("vertical")
# The data used to create the SimpleGridModel
data = [
["bob", 1, True, Float],
["sarah", 45, True, Str],
["jonas", -3, False, direction],
]
rows = [
GridRow(name="Row 1"),
GridRow(name="Row 2"),
GridRow(name="Row 3"),
]
cols = [
GridColumn(name="Name"),
GridColumn(name="Index", read_only=True),
GridColumn(name="Veracity"),
GridColumn(name="Object"),
]
# The data used to create the TraitGridModel
trait_data = [
GridRow(name="Bob", index=1, veracity=True, object=Float),
GridRow(name="Sarah", index=45, veracity=True, object=Str),
GridRow(name="Jonas", index=-3, veracity=False, object=direction),
]
trait_col = [
TraitGridColumn(name="name", label="Name"),
TraitGridColumn(name="index", label="Index", read_only=True),
TraitGridColumn(name="veracity", label="Veracity"),
TraitGridColumn(name="object", label="Object"),
]
# ------------------------------------------------------------------------
# Protected 'SplitApplicationWindow' interface.
# ------------------------------------------------------------------------
def _create_lhs(self, parent):
""" Creates the left hand side or top depending on the split. """
self._model = model = TraitGridModel(
data=self.trait_data, columns=self.trait_col, row_name_trait="name"
)
self._grid = grid = Grid(parent, model=model)
self._grid.observe(
self._on_grid_anytrait_changed,
match(lambda name, ctrait: True) # listen to all traits
)
return grid.control
def _create_rhs(self, parent):
""" Creates the right hand side or bottom depending on the split. """
widget = self._grid
self._python_shell = PythonShell(parent)
self._python_shell.bind("widget", widget)
self._python_shell.bind("w", widget)
return self._python_shell.control
# ------------------------------------------------------------------------
# Private interface.
# ------------------------------------------------------------------------
def _create_content(self, parent):
""" Create some context for an expandable panel. """
tree = FileTree(parent, root=os.path.abspath(os.curdir))
return tree.control
# Trait event handlers -------------------------------------------------
def _on_grid_anytrait_changed(self, event):
""" Called when any trait on the tree has changed. """
print("trait", event.name, "value", event.new)
return
# Application entry point.
if __name__ == "__main__":
# Create the GUI (this does NOT start the GUI event loop).
gui = GUI()
# Create and open the main window.
window = MainWindow()
window.open()
# Start the GUI event loop.
gui.start_event_loop()
|