Beispiel #1
0
    def DeleteSelected(self):

        indices = self._GetSelected()

        indices.sort(reverse=True)

        for index in indices:

            (data, display_tuple,
             sort_tuple) = self._indices_to_data_info[index]

            self.DeleteItem(index)

            del self._data_to_indices[data]

            del self._indices_to_data_info[index]

        self._RecalculateIndicesAfterDelete()

        wx.QueueEvent(self.GetEventHandler(), ListCtrlEvent(-1))
Beispiel #2
0
 def change_image(self, primary_image_file):
     if os.path.exists(primary_image_file):
         client_size = self.GetClientSize()
         # 获取主图片,并将其缩放适应Panel大小
         self._primary_image = wx.Image(primary_image_file,
                                        wx.BITMAP_TYPE_ANY)
         primary_bitmap = self._primary_image.Copy()
         x1 = client_size[0] * primary_bitmap.GetHeight()
         x2 = client_size[1] * primary_bitmap.GetWidth()
         if x1 < x2:
             new_height = int(x1 / float(primary_bitmap.GetWidth()))
             primary_bitmap.Rescale(client_size[0], new_height)
         else:
             new_width = int(x2 / float(primary_bitmap.GetHeight()))
             primary_bitmap.Rescale(new_width, client_size[1])
         # 生成主图片的位图
         self._primary_bitmap = wx.Bitmap(primary_bitmap)
         # 记录新的主图片位图的大小
         self._primary_bitmap_size = wx.Size(primary_bitmap.GetWidth(),
                                             primary_bitmap.GetHeight())
         # 发送绘制背景消息
         wx.QueueEvent(self, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))
Beispiel #3
0
 def EventButton( self, event ):
     
     with ClientGUITopLevelWindows.DialogEdit( self, 'edit time delta' ) as dlg:
         
         panel = ClientGUIScrolledPanels.EditSingleCtrlPanel( dlg )
         
         control = TimeDeltaCtrl( panel, min = self._min, days = self._show_days, hours = self._show_hours, minutes = self._show_minutes, seconds = self._show_seconds, monthly_allowed = self._monthly_allowed )
         
         control.SetValue( self._value )
         
         panel.SetControl( control )
         
         dlg.SetPanel( panel )
         
         if dlg.ShowModal() == wx.ID_OK:
             
             value = panel.GetValue()
             
             self.SetValue( value )
             
             new_event = TimeDeltaEvent( 0 )
             
             wx.QueueEvent( self.GetEventHandler(), new_event )
Beispiel #4
0
    def SetData(self, datas):

        existing_datas = set(self._data_to_indices.keys())

        # useful to preserve order here sometimes (e.g. export file path generation order)
        datas_to_add = [data for data in datas if data not in existing_datas]
        datas_to_update = [data for data in datas if data in existing_datas]
        datas_to_delete = existing_datas.difference(datas)

        if len(datas_to_delete) > 0:

            self.DeleteDatas(datas_to_delete)

        if len(datas_to_update) > 0:

            self.UpdateDatas(datas_to_update)

        if len(datas_to_add) > 0:

            self.AddDatas(datas_to_add)

        self._SortAndRefreshRows()

        wx.QueueEvent(self.GetEventHandler(), ListCtrlEvent(-1))
Beispiel #5
0
 def _select_callback(self, selection):
     selection = (max(0.0, min(selection)), min(max(selection), 1.0))
     evt = PyoGuiSndViewSelectionEvent(value=selection,
                                       id=self.GetId(),
                                       object=self)
     wx.QueueEvent(self, evt)
Beispiel #6
0
 def _position_callback(self, pos):
     evt = PyoGuiSndViewMousePositionEvent(value=pos,
                                           id=self.GetId(),
                                           object=self)
     wx.QueueEvent(self, evt)
Beispiel #7
0
 def _position_callback(self, pos):
     evt = PyoGuiSndViewMousePositionEvent(value=pos)
     wx.QueueEvent(self, evt)
Beispiel #8
0
def HitCancelButton(window):

    wx.QueueEvent(
        window,
        wx.CommandEvent(commandEventType=wx.EVT_BUTTON.typeId,
                        id=wx.ID_CANCEL))
Beispiel #9
0
 def res_init_ui(self, parameter):
     self.ui.main.Connect(-1, -1, self.__RES_INIT_UI_ID,
                          self.res_init_ui_proc)
     wx.QueueEvent(
         self.ui.main,
         XmlResourceHandlerFrameEvent(self.__RES_INIT_UI_ID, None))
Beispiel #10
0
 def start(self, parameter):
     setattr(self.ui, 'main', self.uipool.get(self.dirname, 'main'))
     self.ui.main.Connect(-1, -1, self.__START_EVT_ID, self.showportalframe)
     wx.QueueEvent(self.ui.main, ShowPortalFrameEvent(self.__START_EVT_ID, None))
Beispiel #11
0
    def EventCharHook(self, event):

        HG.client_controller.ResetIdleTimer()

        (modifier, key) = ClientData.ConvertKeyEventToSimpleTuple(event)

        if key in (wx.WXK_INSERT, wx.WXK_NUMPAD_INSERT):

            self._intercept_key_events = not self._intercept_key_events

            self._UpdateBackgroundColour()

        elif key == wx.WXK_SPACE and event.RawControlDown(
        ):  # this is control, not command on os x, for which command+space does some os stuff

            self._ScheduleListRefresh(0.0)

        elif self._intercept_key_events:

            if key in (ord('A'), ord('a')) and modifier == wx.ACCEL_CTRL:

                event.Skip()

            elif key in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER
                         ) and self._ShouldTakeResponsibilityForEnter():

                self._TakeResponsibilityForEnter()

            elif key in (wx.WXK_UP, wx.WXK_NUMPAD_UP, wx.WXK_DOWN,
                         wx.WXK_NUMPAD_DOWN
                         ) and self._text_ctrl.GetValue() == '' and len(
                             self._dropdown_list) == 0:

                if key in (wx.WXK_UP, wx.WXK_NUMPAD_UP):

                    new_event = SelectUpEvent(-1)

                elif key in (wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN):

                    new_event = SelectDownEvent(-1)

                wx.QueueEvent(self.GetEventHandler(), new_event)

            elif key in (wx.WXK_PAGEDOWN, wx.WXK_NUMPAD_PAGEDOWN,
                         wx.WXK_PAGEUP, wx.WXK_NUMPAD_PAGEUP
                         ) and self._text_ctrl.GetValue() == '' and len(
                             self._dropdown_list) == 0:

                if key in (wx.WXK_PAGEUP, wx.WXK_NUMPAD_PAGEUP):

                    new_event = ShowPreviousEvent(-1)

                elif key in (wx.WXK_PAGEDOWN, wx.WXK_NUMPAD_PAGEDOWN):

                    new_event = ShowNextEvent(-1)

                wx.QueueEvent(self.GetEventHandler(), new_event)

            else:

                # Don't say QueueEvent here--it duplicates the event processing at higher levels, leading to 2 x F9, for instance
                self._dropdown_list.EventCharHook(
                    event
                )  # this typically skips the event, letting the text ctrl take it

        else:

            event.Skip()
Beispiel #12
0
 def initui(self, parameter):
     setattr(self.ui, "main", parameter)
     self.ui.main.Connect(-1, -1, self.__INIT_NOISE_EVT_ID, self.initData)
     wx.QueueEvent(self.ui.main,
                   RenderHandlerFrameEvent(self.__INIT_NOISE_EVT_ID, None))
Beispiel #13
0
    def _OKParent(self):

        wx.QueueEvent(self.GetEventHandler(),
                      ClientGUITopLevelWindows.OKEvent(-1))
Beispiel #14
0
 def add_resource_show(self, parameter):
     self.ui.main.Connect(-1, -1, self.__RES_DLG_SHOW_ID,
                          self.add_resource_show_proc)
     wx.QueueEvent(
         self.ui.main,
         XmlResourceHandlerFrameEvent(self.__RES_DLG_SHOW_ID, parameter))
Beispiel #15
0
 def update_initresource(self, parameter):
     self.ui.main.Connect(-1, -1, self.__UPDATE_INIT_RES,
                          self.update_initresource_proc)
     wx.QueueEvent(
         self.ui.main,
         XmlResourceHandlerFrameEvent(self.__UPDATE_INIT_RES, None))
Beispiel #16
0
 def rem_resource(self, event):
     self.ui.main.Connect(-1, -1, self.__RES_REMOVE_ID,
                          self.rem_resource_proc)
     wx.QueueEvent(self.ui.main,
                   XmlResourceHandlerFrameEvent(self.__RES_REMOVE_ID, None))
Beispiel #17
0
    def OnSystemInfoEvent(self, info):
        """
        接收监控System的信息,并刷新界面
        :param info:
        :return:
        """
        self.__logger.debug("sw version = %s" % info["version"]['sw'])
        self.__logger.debug("hw version = %s" % info["version"]['hw'])
        self.__logger.debug("temperature = %s" % info["temperature"])
        self.__logger.debug("ip = %s" % info["ip"])
        self.__logger.debug("uuid = %s" % info["uuid"])
        self.__logger.debug("memory = %s" % info["memory"])
        self.__logger.debug("cpu = %s" % info["cpu"])
        self.__logger.debug("network = %s" % info["network"])
        self.__logger.debug("uptime = %s" % info["uptime"])
        """
        print("system info : sw version = ", info["version"]['sw'])
        print("system info : hw version = ", info["version"]['hw'])
        print("system info : temperature = ", info["temperature"])
        print("system info : ip = ", info["ip"])
        print("system info : uuid = ", info["uuid"])
        print("system info : memory = ", info["memory"])
        print("system info : cpu = ", info["cpu"])
        print("system info : network = ", info["network"])
        print("system info : uptime = ", info["uptime"])
        # print("system info : storage = ", info["storage"])
        """

        uuid = info["uuid"][-4:]
        self.__logger.debug("uuid = %s" % uuid)
        self.__logger.debug("focus uuid = %s" % self.focus_node[-4:])

        self.system_info[uuid] = info  # 每个设备根据UUID保存一份系统信息
        if uuid != self.focus_node[-4:]:  # 不是当前焦点的uuid,则不显示系统信息
            # print("not focus node chart!")
            return

        # 计算CPU核数
        cpu_core = len(info["cpu"].keys())
        self.__logger.debug("cpu core = %d" % cpu_core)

        # 计算内存占有率
        total = int(int(info["memory"]["total"][:-1]))
        used = int(int(info["memory"]["used"][:-1]))

        memory_usage = (used * 100) // total
        self.__logger.debug("memory usage = %d" % memory_usage)

        network_tx = float(
            self.non_decimal.sub('', self.system_info[uuid]["network"]["tx"]))
        if self.system_info[uuid]["network"]["tx"][-1] == 'M':
            network_tx * 1024
        network_rx = float(
            self.non_decimal.sub('', self.system_info[uuid]["network"]["rx"]))
        if self.system_info[uuid]["network"]["rx"][-1] == 'M':
            network_rx * 1024

        if (network_tx + network_rx) > 1024:
            network_total = "%.2fM" % ((network_tx + network_rx) / 1024)
        else:
            network_total = "%.2fK" % (network_tx + network_rx)

        # 刷新某个设备节点的性能信息
        evt = PerformanceInfoEvent(uptime=info["uptime"],
                                   temperature=info["temperature"],
                                   memory=memory_usage,
                                   network=network_total,
                                   cpu=cpu_core)
        wx.QueueEvent(self.system_info_panel.performance_info, evt)

        # 刷新某个设备节点的设备信息
        evt = NodeInfoEvent(hw=info["version"]['hw'],
                            sw=info["version"]['sw'],
                            ip=info["ip"],
                            uuid=info["uuid"])
        wx.QueueEvent(self.system_info_panel.node_info, evt)

        # 刷新设备CPU图表
        if info["cpu"]:
            # print("labels = ", info["cpu"].keys())
            # print("values = ", info["cpu"].values())

            evt = CpuInfoEvent(data=info["cpu"].values(),
                               labels=info["cpu"].keys())

            wx.QueueEvent(self.diagram_info_panel.cpu_info_panel, evt)

        # 刷新设备Memory图表
        if info["memory"]:
            sizes = []
            memory_sizes = []
            memory_labels = ['used', 'unused']

            for size in info['memory'].values():
                sizes.append(int(size[:-1]))

            total = int(sizes[0])
            used = int(sizes[1])

            memory_usage = (used * 100) // total

            memory_sizes.append(memory_usage)
            memory_sizes.append(100 - memory_usage)

            evt = MemoryInfoEvent(sizes=memory_sizes, labels=memory_labels)

            wx.QueueEvent(self.diagram_info_panel.memory_info_panel, evt)

        # 刷新设备网络信息图表
        if info["network"]:
            evt = NetworkInfoEvent(tx=info["network"]["tx"],
                                   rx=info["network"]["rx"])

            wx.QueueEvent(self.diagram_info_panel.network_panel, evt)
Beispiel #18
0
 def _on_btn_import_users(self, event):
     file_dialog = wx.FileDialog(
         self,
         "选择要导入的用户数据文件",
         wildcard="Excel 文件(*.xlsx)|*.xlsx|Excel97-2003 文件(*.xls)|*.xls",
         style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
     if file_dialog.ShowModal() == wx.ID_OK:
         # 导入操作进行时设置鼠标形状为箭头等待状态
         self.SetCursor(wx.Cursor(wx.CURSOR_ARROWWAIT))
         # 记录是否覆盖数据状态
         b_cover_data = self._chk_cover_users_data.GetValue()
         # 获取待导入的文件
         file = file_dialog.GetPath()
         # 打开Excel文件
         conn_str = (
             r'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;'
             % file)
         conn_excel = pyodbc.connect(conn_str, autocommit=True)
         cursor_excel = conn_excel.cursor()
         cursor_excel_tmp = conn_excel.cursor()
         # 连接数据库
         conn = pyodbc.connect(
             'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s\\LMSdb.accdb'
             % os.getcwd())
         cursor = conn.cursor()
         # 逐个表读取数据
         for worksheet in cursor_excel.tables():
             # 获取表名
             table_name = worksheet[2]
             # 读取表内容
             sel_str = (r'SELECT * FROM [%s]' % table_name)
             excel_rows = cursor_excel_tmp.execute(sel_str).fetchall()
             # 逐行读取
             for index, excel_row in enumerate(excel_rows):
                 # 行数据不完善(用户Id、用户名字或用户班级为空)时,跳过该行
                 if (excel_row[0] is None) or (excel_row[1] is None) or (
                         excel_row[3] is None):
                     continue
                 # 在数据库中查找是否存在该Id的用户
                 cursor.execute(
                     "SELECT user_id FROM users WHERE user_id = ?",
                     excel_row[0])
                 user = cursor.fetchone()
                 if user is None:  # 无此用户,则将该用户添加到数据库中
                     cursor.execute(
                         """
                         INSERT INTO users(user_id, user_name, user_photo, user_class)
                         VALUES(?, ?, ?, ?)""", excel_row[0], excel_row[1],
                         excel_row[2], excel_row[3])
                 elif b_cover_data:  # 有此用户,且需要覆盖原数据时,则更新该用户信息。(不能覆盖原数据时不进行操作)
                     cursor.execute(
                         """
                         UPDATE users SET user_name=?, user_photo=?, user_class=?
                         WHERE user_id=?""", excel_row[1], excel_row[2],
                         excel_row[3], excel_row[0])
                 conn.commit()
         # 关闭Excel文件
         cursor_excel_tmp.close()
         cursor_excel.close()
         conn_excel.close()
         # 关闭数据库
         cursor.close()
         conn.close()
         # 恢复鼠标形状
         self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
         # 弹出提示框
         wx.MessageBox("导入完成!")
         # 更新显示当前班级用户
         wx.QueueEvent(self, wx.PyCommandEvent(wx.EVT_CHOICE))
     event.Skip()
Beispiel #19
0
    def OnNodeShow(self, evt):
        """

        :param evt:
        :return:
        """
        self.__logger.info("Switch Node = {} --> {}".format(
            self.focus_node, evt.name))

        if self.focus_node != evt.name:
            self.focus_node = evt.name

            uuid = self.focus_node[-4:]

            # 计算cpu核数
            cpu_core = len(self.system_info[uuid]["cpu"].keys())
            self.__logger.debug("cpu core = {}".format(cpu_core))

            # 计算内存占有率
            total = int(self.system_info[uuid]['memory']['total'][:-1])
            used = int(self.system_info[uuid]['memory']['used'][:-1])
            memory_usage = (used * 100) // total
            self.__logger.debug("memory usage = {}".format(memory_usage))

            # 计算网络速率
            network_tx = float(
                self.non_decimal.sub('',
                                     self.system_info[uuid]["network"]["tx"]))
            if self.system_info[uuid]["network"]["tx"][-1] == 'M':
                network_tx * 1024
            network_rx = float(
                self.non_decimal.sub('',
                                     self.system_info[uuid]["network"]["rx"]))
            if self.system_info[uuid]["network"]["rx"][-1] == 'M':
                network_rx * 1024

            if (network_tx + network_rx) > 1024:
                network_total = "%.2fM" % ((network_tx + network_rx) / 1024)
            else:
                network_total = "%.2fK" % (network_tx + network_rx)
            #network_tx = float(self.system_info[uuid]["network"]["tx"])
            #network_rx = float(self.system_info[uuid]["network"]["rx"])

            # 刷新设备性能信息
            evt = PerformanceInfoEvent(
                uptime=self.system_info[uuid]["uptime"],
                temperature=self.system_info[uuid]["temperature"],
                memory=memory_usage,
                network=network_total,
                cpu=cpu_core)
            wx.QueueEvent(self.system_info_panel.performance_info, evt)

            # 刷新设备节点信息
            evt = NodeInfoEvent(hw=self.system_info[uuid]["version"]['hw'],
                                sw=self.system_info[uuid]["version"]['sw'],
                                ip=self.system_info[uuid]["ip"],
                                uuid=self.system_info[uuid]["uuid"])
            wx.QueueEvent(self.system_info_panel.node_info, evt)

            # 刷新设备CPU图表
            if self.system_info[uuid]["cpu"]:
                # print("labels = ", self.system_info[uuid]["cpu"].keys())
                # print("values = ", self.system_info[uuid]["cpu"].values())

                evt = CpuInfoEvent(data=self.system_info[uuid]["cpu"].values(),
                                   labels=self.system_info[uuid]["cpu"].keys())

                wx.QueueEvent(self.diagram_info_panel.cpu_info_panel, evt)

            # 刷新设备Memory图表
            if self.system_info[uuid]["memory"]:
                sizes = []
                memory_sizes = []
                memory_labels = ['used', 'unused']

                for size in self.system_info[uuid]['memory'].values():
                    sizes.append(int(size[:-1]))

                total = int(sizes[0])
                used = int(sizes[1])

                # print("total = ", total)
                # print("used = ", used)

                memory_usage = (used * 100) // total

                memory_sizes.append(memory_usage)
                memory_sizes.append(100 - memory_usage)

                evt = MemoryInfoEvent(sizes=memory_sizes, labels=memory_labels)

                wx.QueueEvent(self.diagram_info_panel.memory_info_panel, evt)

            # 刷新设备网络信息图表
            if self.system_info[uuid]["network"]:
                evt = NetworkInfoEvent(
                    tx=self.system_info[uuid]["network"]["tx"],
                    rx=self.system_info[uuid]["network"]["rx"])

                wx.QueueEvent(self.diagram_info_panel.network_panel, evt)

        pass
Beispiel #20
0
    def SetFocus(self, focus):
        """
        设置当前TAB面板是否聚焦
        :param focus: =True, 设置当前面板聚焦
        :return:
        """
        # print("name = ", self.name)
        # print("focus = ", focus)
        # print("self.focus = ", self.focus)
        # print("self.tab = ", self.tab)
        if self.focus != focus:
            if focus:
                self.module_name.SetBackgroundColour((0xfe, 0xd3, 0x63))
                self.module_name.SetForegroundColour((0, 0, 0))

                if self.tab == 'Modules':
                    #self.modules.SetBackgroundColour((0x27, 0xc1, 0xf8))
                    self.modules.SetBackgroundColour('DodgerBlue')
                    self.modules.SetForegroundColour((250, 255, 255))

                    self.charts.SetBackgroundColour("GREY")
                    self.charts.SetForegroundColour((250, 255, 255))
                else:
                    self.modules.SetBackgroundColour("GREY")
                    self.modules.SetForegroundColour((250, 255, 255))

                    # self.charts.SetBackgroundColour((0x27, 0xc1, 0xf8))
                    self.charts.SetBackgroundColour('DodgerBlue')
                    self.charts.SetForegroundColour((250, 255, 255))

                if self.tab == 'Modules':
                    # self.modules.SetBackgroundColour((0x27, 0xc1, 0xf8))
                    self.modules.SetBackgroundColour('DodgerBlue')
                    self.modules.SetForegroundColour((250, 255, 255))

                    self.charts.SetBackgroundColour("GREY")
                    self.charts.SetForegroundColour((250, 255, 255))

                    # 发送切换Module图表
                    evt = ModuleEvent(
                        name=self.tab,
                    )

                    wx.QueueEvent(wx.GetApp().GetTopWindow(), evt)
                else:
                    self.modules.SetBackgroundColour("GREY")
                    self.modules.SetForegroundColour((250, 255, 255))

                    # self.charts.SetBackgroundColour((0x27, 0xc1, 0xf8))
                    self.charts.SetBackgroundColour('DodgerBlue')
                    self.charts.SetForegroundColour((250, 255, 255))

                    # 发送切换Chart图表
                    evt = ChartEvent(
                        name=self.tab,
                    )

                    wx.QueueEvent(wx.GetApp().GetTopWindow(), evt)
            else:
                self.module_name.SetBackgroundColour("GREY")
                self.module_name.SetForegroundColour((250, 255, 255))

                self.modules.SetBackgroundColour("GREY")
                self.modules.SetForegroundColour((250, 255, 255))

                self.charts.SetBackgroundColour("GREY")
                self.charts.SetForegroundColour((250, 255, 255))

        self.focus = focus
        pass
Beispiel #21
0
 def addtomain(self, parameter):
     print('init extension menu')
     self.ui.main.Connect(-1, -1, self.__ADD_TO_MAIN_EVT_ID, self.addtomain_proc)
     wx.QueueEvent(self.ui.main, ShowPortalFrameEvent(self.__ADD_TO_MAIN_EVT_ID, parameter))
Beispiel #22
0
 def got_resmgr_lexicon(self, parameter):
     print("calls got_resmgr_lexicon")
     self.__resmgr = parameter.result
     wx.QueueEvent(self.ui.main,
                   LexiconHandlerFrameEvent(self.__INIT_LEXICON_UI, None))
Beispiel #23
0
def PostSizeChangedEvent(window):

    event = CC.SizeChangedEvent(-1)

    wx.QueueEvent(window.GetEventHandler(), event)
Beispiel #24
0
 def bind_events(self, parameter):
     self.ui.main.Connect(-1, -1, self.__BIND_EVT_ID, self.bind_event_ui_proxy)
     wx.QueueEvent(self.ui.main, ShowPortalFrameEvent(self.__BIND_EVT_ID, parameter))
Beispiel #25
0
 def _outFunction(self, value):
     evt = PyoGuiKeyboardEvent(value=value, id=self.GetId(), object=self)
     wx.QueueEvent(self, evt)
Beispiel #26
0
 def initui(self, parameter):
     setattr(self.ui, "main", parameter)
     self.ui.main.Connect(-1, -1, self.__INIT_ALGOS_EVT_ID, self.initHashes)
     wx.QueueEvent(self.ui.main, HashHandlerFrameEvent(self.__INIT_ALGOS_EVT_ID, parameter))
Beispiel #27
0
def HitButton(button):

    wx.QueueEvent(
        button,
        wx.CommandEvent(commandEventType=wx.EVT_BUTTON.typeId,
                        id=button.GetId()))
Beispiel #28
0
 def _outFunction(self, value):
     evt = PyoGuiMultiSliderEvent(value=value,
                                  id=self.GetId(),
                                  object=self)
     wx.QueueEvent(self, evt)
Beispiel #29
0
def HitOKButton(window):

    wx.QueueEvent(
        window,
        wx.CommandEvent(commandEventType=wx.EVT_BUTTON.typeId, id=wx.ID_OK))
Beispiel #30
0
 def _outFunction(self, value):
     evt = PyoGuiMultiSliderEvent(value=value)
     wx.QueueEvent(self, evt)