#!/usr/bin/env python3 import wx #from cam_server_client import PipelineClient from fake import PipelineClient from tools import EXPANDING, STRETCH, make_filled_vbox, make_filled_hbox from mathentry import MathEntry from listentry import ListEntry pc = PipelineClient("http://sf-daqsync-01:8889") si = pc.get_server_info() ai = si["active_instances"] pls = (i for i in ai if "psen_db" in i) pls = sorted(pls) class MainFrame(wx.Frame): def __init__(self, parent=None, title="test"): super().__init__(parent, title=title) panel_main = MainPanel(self) self.sizer = sizer = make_filled_vbox([panel_main]) self.SetSizerAndFit(sizer) class MainPanel(wx.Panel): def __init__(self, parent): super().__init__(parent) self.cb_pls = cb_pls = wx.ComboBox(self, choices=pls) self.entries = entries = SettingsList(self) self.btn_print = btn_print = wx.Button(self, label="Print") cb_pls.Bind(wx.EVT_COMBOBOX, self.on_select) btn_print.Bind(wx.EVT_BUTTON, self.on_print) widgets = [cb_pls, entries, btn_print] sizer = make_filled_vbox(widgets) self.SetSizer(sizer) def on_select(self, event): instance = self.cb_pls.GetValue() cfg = pc.get_instance_config(instance) self.entries.update(cfg) self._adjust_size() def _adjust_size(self): parent = self.GetParent() parent.sizer.Layout() parent.Fit() def on_print(self, event): data = self.entries.get() print(data) class SettingsList(wx.GridSizer): def __init__(self, parent, hgap=5, vgap=5): super().__init__(cols=2, hgap=hgap, vgap=vgap) self.parent = parent self.children = [] def update(self, cfg): self.clear() for k, v in sorted(cfg.items()): self.add(k, v) def clear(self): self.Clear(True) def add(self, *args): new = Setting(self.parent, *args) self.children.append(new) self.Add(new.state) self.Add(new.text, 0, wx.EXPAND|wx.ALL) def get(self): res = {} for i in self.children: name = i.get_name() print(name) if i.get_state(): value = i.get_value() else: value = None res[name] = value return res class Setting: def __init__(self, parent, label, value): self.state = state = wx.CheckBox(parent, label=label) if isinstance(value, list): self.text = text = ListEntry(parent, style=wx.TE_RIGHT) else: self.text = text = MathEntry(parent, style=wx.TE_RIGHT) state.Bind(wx.EVT_CHECKBOX, self.on_state_change) if value is None: state.SetValue(False) text.Disable() else: state.SetValue(True) text.SetValue(value) def get_name(self): return self.state.GetLabel() def get_state(self): return self.state.GetValue() def get_value(self): return self.text.GetValue() def on_state_change(self, event): if self.get_state(): self.text.Enable() else: self.text.Disable() app = wx.App() frame = MainFrame() frame.Show() app.MainLoop()