0

I want to initialize a large number of widgets that are the same, for example in the following case:

self.acc_viewer0 = plot_widget.AnalysisTool()
self.acc_viewer0.setMaximumHeight(1000)
self.acc_viewer1 = plot_widget.AnalysisTool()
self.acc_viewer1.setMaximumHeight(1000)
self.acc_viewer2 = plot_widget.AnalysisTool()
self.acc_viewer2.setMaximumHeight(1000)
self.acc_viewer2.hide()
self.acc_viewer3 = plot_widget.AnalysisTool()
self.acc_viewer3.setMaximumHeight(1000)
self.acc_viewer3.hide()
self.acc_viewer4 = plot_widget.AnalysisTool()
self.acc_viewer4.setMaximumHeight(1000)
self.acc_viewer4.hide()
self.acc_viewer5 = plot_widget.AnalysisTool()
self.acc_viewer5.setMaximumHeight(1000)
self.acc_viewer5.hide()
self.acc_viewer6 = plot_widget.AnalysisTool()
self.acc_viewer6.setMaximumHeight(1000)
self.acc_viewer6.hide()
self.acc_viewer7 = plot_widget.AnalysisTool()
self.acc_viewer7.setMaximumHeight(1000)
self.acc_viewer7.hide()
self.acc_viewer8 = plot_widget.AnalysisTool()
self.acc_viewer8.setMaximumHeight(1000)
self.acc_viewer8.hide()

I want to find a way to make this slick and elegant, I may want to add 50 widgets and in that case, it looks terrible. I am searching for something like:

for var in range(num):
    widget_name = 'acc_viewer{0}'.format(var)
    self.widget_name = plot_widget.AnalysisTool()
    self.widget_name.setMaximumHeight(1000)

*plot_widget.AnalysisTool is my custom widget, see example in picture enter image description here

  • You can use [`setattr()`](https://docs.python.org/3/library/functions.html#setattr), but the reality is that most of the time you don't really need to create individual instance attributes for objects generated dynamically: instead, use a data structure instead, like a list (to access by index) or a dict (by key). – musicamante Oct 09 '22 at 11:35

1 Answers1

-1

Update - I tackled this issue using:

    num = 9 # maximum number of plots
    for var in range(num):
        exec(f'self.acc_viewer{var} = plot_widget.AnalysisTool()')
        exec(f'self.acc_viewer{var}.setMaximumHeight(1000)')
        exec(f'self.acc_viewer{var}.setMinimumHeight(250)')
  • Do ***NOT*** use `exec` unless you *really* know what you're doing, and especially not for that: that's the worst and most dangerous way to do it. – musicamante Oct 09 '22 at 11:36