Setting event handlers dynamically

slot parameter puts a component in predefined area, like default - cards, sidebar and nav-right on MaterialDesign theme (forum post)

In fact, I tried to run the above code without the slot parameter, and if works from some reason! Maybe it is related to particular browser, or the fact that I’m still on a trial plan, so there might be some additional iframes around my screen.

But I found an even better and ‘prettier’ solution - by putting a LinearPanel around Link elements, so each menu is a LinearPanel, which can then be hidden or shown, like this:

from anvil import *

class Form1(Form1Template):

  def __init__(self, **properties):
    self.init_components(**properties)
    self.myMenu1Items=[]
    self.myMenu2Items=[]
    
  def buildingMenus(self):
    l = Link(text="First menu 1")
    l.set_event_handler("click", self.eventHandler)
    self.myMenu1Items.append(l)

    l = Link(text="First menu 2")
    l.set_event_handler("click", self.eventHandler)
    self.myMenu1Items.append(l)

    l = Link(text="Second menu 1")
    l.set_event_handler("click", self.eventHandler)
    self.myMenu2Items.append(l)
    
  def showMenus(self):
    self.myMenu1 = LinearPanel(visible=True)
    for m1 in self.myMenu1Items:
      self.myMenu1.add_component(m1)
    self.myMenu2 = LinearPanel(visible=False)
    for m2 in self.myMenu2Items:
      self.myMenu2.add_component(m2)
    self.add_component(self.myMenu1, slot='sidebar')
    self.add_component(self.myMenu2, slot='sidebar')
  
  def eventHandler(self, **event_args):
    self.add_component(TextBox(text="menu was clicked"))
    self.myMenu1.visible = not self.myMenu1.visible
    self.myMenu2.visible = not self.myMenu2.visible
  
  def form_show (self, **event_args):
    self.buildingMenus()
    self.showMenus()

Thanks for your guidance!

1 Like