Dynamically enable/disable buttons based on rowdata

To generically enable/disable buttons on the root container based on whether their label appears in a dataset column, you want to:

  1. Collect all button components on the root container.
  2. Get the set of valid labels from your dataset.
  3. Loop through each button and enable/disable it depending on whether its label is in the dataset.

Here’s a generic approach in Jython for Ignition Vision:


1. Get All Buttons on the Root Container

You can use getComponents() recursively to find all buttons (assuming they’re javax.swing.JButton or Ignition’s Button component).

def getAllButtons(container):  
    buttons = []  
    for comp in container.getComponents():  
        # If it's a button, add it  
        # check specific class name, this will vary  
        if comp.__class__.__name__ == "Button":  
            buttons.append(comp)  
        # If it's a container, recurse  
        elif hasattr(comp, 'getComponents'):  
            buttons += getAllButtons(comp)  
    return buttons  

2. Get Valid Labels from Dataset

# Assuming your dataset is called 'dataset' and column is 'Button'  
validLabels = set()  
for rowIndex in range(dataset.getRowCount()):  
    validLabels.add(str(dataset.getValueAt(rowIndex, "Button")))  

3. Enable/Disable Buttons

Assume each button’s text property is its label:

root = event.source.parent  # Root Container  
  
buttons = getAllButtons(root)  
  
for btn in buttons:  
    label = str(btn.text)  
    btn.enabled = label in validLabels  

Full Example

def getAllButtons(container):  
    buttons = []  
    for comp in container.getComponents():  
	    # check specific class name, this will vary  
        if comp.__class__.__name__ == "Button":  
            buttons.append(comp)  
        elif hasattr(comp, 'getComponents'):  
            buttons += getAllButtons(comp)  
    return buttons  
  
# Get dataset (replace with your actual dataset source)  
dataset = event.source.data  # Or however you get your dataset  
  
# Build set of valid labels  
validLabels = set()  
for rowIndex in range(dataset.getRowCount()):  
    validLabels.add(str(dataset.getValueAt(rowIndex, "Button")))  
  
# Get all buttons on root container  
root = event.source.parent  
buttons = getAllButtons(root)  
  
# Enable/disable based on presence in dataset  
for btn in buttons:  
    label = str(btn.text)  
    btn.enabled = label in validLabels  

Tips

  • If your button labels are stored elsewhere (e.g., custom property), adjust btn.text accordingly.
  • This approach works even if you add/remove buttons or change their labels—it’s generic!

Let me know if you need this adapted for Perspective or have other requirements!

i need some print statements for debugging

Absolutely! Adding print statements is a great way to debug and understand what’s happening at each step. Here’s your full script with helpful print statements added throughout:

def getAllButtons(container, depth=0):  
    buttons = []  
    indent = "  " * depth  
    for comp in container.getComponents():  
        print("%sChecking component: %s (type: %s)" % (indent, getattr(comp, 'name', '<no name>'), comp.__class__.__name__))  
        if comp.__class__.__name__ == "Button":  
            print("%s  -> Found Button: %s (text: '%s')" % (indent, getattr(comp, 'name', '<no name>'), getattr(comp, 'text', '<no text>')))  
            buttons.append(comp)  
        elif hasattr(comp, 'getComponents'):  
            print("%s  -> Recursing into container: %s" % (indent, getattr(comp, 'name', '<no name>')))  
            buttons += getAllButtons(comp, depth+1)  
    return buttons  
  
# Get dataset (replace with your actual dataset source)  
dataset = event.source.data  # Or however you get your dataset  
  
# Build set of valid labels  
validLabels = set()  
print("Building set of valid labels from dataset:")  
for rowIndex in range(dataset.getRowCount()):  
    label = str(dataset.getValueAt(rowIndex, "Knop"))  
    print("  Row %d: '%s'" % (rowIndex, label))  
    validLabels.add(label)  
print("Valid labels found:", validLabels)  
  
# Get all buttons on root container  
root = event.source.parent  
print("Getting all buttons on root container...")  
buttons = getAllButtons(root)  
print("Total buttons found:", len(buttons))  
  
# Enable/disable based on presence in dataset  
for btn in buttons:  
    label = str(btn.text)  
    if label in validLabels:  
        print("Enabling button '%s' (label found in dataset)" % label)  
        btn.enabled = True  
    else:  
        print("Disabling button '%s' (label NOT found in dataset)" % label)  
        btn.enabled = False  

What these print statements do:

  • Component discovery: Shows every component checked and when recursion happens.
  • Button detection: Prints when a button is found and its text.
  • Dataset parsing: Prints each row’s label as it’s added to the set.
  • Button enable/disable: Prints whether each button is enabled or disabled and why.

Tip:
You can view these prints in the Output Console of the Ignition Designer while testing.

Let me know if you want even more detailed output or have other requirements!

when the label contains IBC