class FtpPanel(wx.Panel): def __init__(self, parent): super().__init__(parent) self.frame = parent self.ftp = None self.paths = [] self.main_sizer = wx.BoxSizer(wx.VERTICAL) self.create_ui() self.SetSizer(self.main_sizer) pub.subscribe(self.update, 'update') pub.subscribe(self.update_status, 'update_status') def create_ui(self): size = (150, -1) connect_sizer = wx.BoxSizer() # host, username, password, port, connect button host_lbl = wx.StaticText(self, label='Host:') connect_sizer.Add(host_lbl, 0, wx.ALL | wx.CENTER, 5) self.host = wx.TextCtrl(self, size=size) connect_sizer.Add(self.host, 0, wx.ALL, 5) user_lbl = wx.StaticText(self, label='Username:'******'Password:'******'Port:') connect_sizer.Add(port_lbl, 0, wx.ALL | wx.CENTER, 5) self.port = wx.TextCtrl(self, value='21', size=(50, -1)) connect_sizer.Add(self.port, 0, wx.ALL, 5) connect_btn = wx.Button(self, label='Connect') connect_btn.Bind(wx.EVT_BUTTON, self.on_connect) connect_sizer.Add(connect_btn, 0, wx.ALL, 5) self.main_sizer.Add(connect_sizer) self.status = wx.TextCtrl(self, style=wx.TE_MULTILINE) self.main_sizer.Add(self.status, 1, wx.ALL | wx.EXPAND, 5) folder_ico = wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_TOOLBAR, (16, 16)) file_ico = wx.ArtProvider.GetBitmap(wx.ART_HELP_PAGE, wx.ART_TOOLBAR, (16, 16)) self.remote_server = ObjectListView(self, style=wx.LC_REPORT | wx.SUNKEN_BORDER) self.remote_server.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.on_change_directory) self.remote_server.AddNamedImages('folder', smallImage=folder_ico) self.remote_server.AddNamedImages('file', smallImage=file_ico) self.remote_server.SetEmptyListMsg("Not Connected") self.main_sizer.Add(self.remote_server, 2, wx.ALL | wx.EXPAND, 5) self.update_ui() def on_connect(self, event): host = self.host.GetValue() username = self.user.GetValue() password = self.password.GetValue() port = int(self.port.GetValue()) self.frame.SetStatusText('Connecting...', 1) if host and username and password and port: self.ftp = FTP() try: self.ftp.disconnect() except: pass args = [self.ftp, host, port, username, password] self.thread = threading.Thread(target=self.connect_thread, args=args) self.thread.daemon = True self.thread.start() def change_dir_thread(self, ftp, folder): """ This method should only be run using a thread """ ftp.change_directory(folder) def connect_thread(self, ftp, host, port, username, password): """ This method should only be run using a thread """ ftp.connect(host, port, username, password) def image_getter(self, path): """ Helper method to determine which image to use in the ObjectListView widget """ if path.folder: return "folder" else: return "file" def on_change_directory(self, event): current_selection = self.remote_server.GetSelectedObject() if current_selection.folder: self.thread = threading.Thread( target=self.change_dir_thread, args=[self.ftp, current_selection.filename]) self.thread.daemon = True self.thread.start() def update(self, paths): """ Called by pubsub / thread """ self.paths = paths self.update_ui() def update_status(self, message): """ Called by pubsub / thread """ ts = time.strftime(time.strftime('%H:%M:%S', time.gmtime(time.time()))) if '\n' in message: for line in message.split('\n'): line = f'{ts} {line}' self.status.WriteText(f'{line}\n') else: message = f'{ts} {message}' self.status.WriteText(f'{message}\n') def update_ui(self): self.remote_server.SetColumns([ ColumnDefn("File/Folder", "left", 800, "filename", imageGetter=self.image_getter), ColumnDefn("Filesize", "right", 80, "size"), ColumnDefn("Last Modified", "left", 150, "last_modified") ]) self.remote_server.SetObjects(self.paths)
class DataCoefPanel(wx.Frame): def __init__(self, parent): pos = wx.DefaultPosition size = (377, 282) if _platform == 'darwin': style = wx.DEFAULT_FRAME_STYLE else: style = (wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.FRAME_FLOAT_ON_PARENT) wx.Frame.__init__(self, wx.GetApp().TopWindow, wx.ID_ANY, p4R.Application_name + " - Strain and DW Values", pos, size, style) self.Bind(wx.EVT_CLOSE, self.on_close) self.SetIcon(prog_icon.GetIcon()) pnl = wx.Panel(self) def handleCellEditStarting(evt): currentCol = self.GetOLVColClicked(evt) if currentCol == 0: evt.Veto() def handleCellEditFinishing(evt): currentline = evt.rowIndex currentCol = self.GetOLVColClicked(evt) val = evt.cellValue self.update_param_dict(currentline, currentCol, val) self.list = ObjectListView(pnl, sortable=False, style=wx.LC_REPORT | wx.SUNKEN_BORDER, size=(450, 500)) self.list.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK self.list.handleStandardKeys = False self.list.SetEmptyListMsg("This database has no rows") self.list.SetEmptyListMsgFont( wx.FFont(24, wx.DEFAULT, faceName="Tekton")) if _platform == "linux" or _platform == "linux2": self.width_name = 120 else: self.width_name = 80 self.width = 70 self.widthCheck = 25 self.col2checkstatus = {1: 0, 2: 0} self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list) self.Bind(wx.EVT_LIST_COL_CLICK, self.OnItemSelected, self.list) self.list.Bind(EVT_CELL_EDIT_STARTING, handleCellEditStarting) self.list.Bind(EVT_CELL_EDIT_FINISHING, handleCellEditFinishing) mastersizer = wx.BoxSizer(wx.HORIZONTAL) mastersizer.Add(self.list, 0, wx.ALL | wx.EXPAND, 5) pub.subscribe(self.on_fill_list, pubsub_Fill_List_coef) pub.subscribe(self.on_open_window, pubsub_Open_data_coef_Window) # self.Bind(wx.EVT_SIZE, self.OnSize) pnl.SetSizer(mastersizer) pnl.Layout() pnl.Fit() self.InitializeList() def on_open_window(self): self.CenterOnParent() def on_close(self, event): pub.sendMessage(pubsub_Hide_Show_data_coef, test=1) def InitializeList(self): temp = [] ic_ = prog_icon_curve.GetBitmap() ImageIndex = self.list.AddImages(ic_) self.list.AddNamedImages("name", ic_) temp.append( ColumnDefn(headercolumnname[0], "center", self.width_name, valueGetter=headercolumnname[0], imageGetter=ImageIndex, maximumWidth=self.width_name)) temp.append( ColumnDefn(headercolumnname[1], "center", self.width, valueGetter="sp", maximumWidth=self.width, checkStateGetter="state1")) temp.append( ColumnDefn(headercolumnname[3], "center", self.width, valueGetter="dwp", maximumWidth=self.width, checkStateGetter="state2")) self.list.SetColumns(temp) def on_fill_list(self): a = P4Rm() self.Freeze() list_temp = [] roundval = 3 if a.AllDataDict['model'] == 2: for i in range(7): name = asym_pv[i] val_sp = str(round(a.ParamDict['sp'][i], roundval)) val_dwp = str(round(a.ParamDict['dwp'][i], roundval)) check_sp = a.ParamDict['state_sp'][i] check_dwp = a.ParamDict['state_dwp'][i] list_temp.append( CoefListData(name, val_sp, check_sp, val_dwp, check_dwp)) else: len_sp = len(a.ParamDict['sp']) len_dwp = len(a.ParamDict['dwp']) if len_sp > len_dwp: num = len_sp else: num = len_dwp for i in range(num): if i < len_sp: val_sp = str(round(a.ParamDict['sp'][i], roundval)) check_sp = a.ParamDict['state_sp'][i] else: val_sp = "" check_sp = True if i < len_dwp: val_dwp = str(round(a.ParamDict['dwp'][i], roundval)) check_dwp = a.ParamDict['state_dwp'][i] else: val_dwp = "" check_dwp = True list_temp.append( CoefListData(i + 1, val_sp, check_sp, val_dwp, check_dwp)) self.list.SetObjects(list_temp) self.Thaw() def update_param_dict(self, currentline, currentCol, val): if currentCol == 1: P4Rm.ParamDict['sp'][currentline] = float(val) if currentCol == 2: P4Rm.ParamDict['dwp'][currentline] = float(val) self.read_and_update() def read_and_update(self): pub.sendMessage(pubsub_update_sp_dwp_eta) b = Calcul4Radmax() b.on_update() def OnItemSelected(self, event): if 'phoenix' in wx.PlatformInfo: currentline = event.Index else: currentline = event.m_itemIndex currentCol = self.GetOLVColClicked(event) if currentline == -1: self.Freeze() if currentCol == 1 or currentCol == 2: if self.col2checkstatus[currentCol] == 0: val = False self.col2checkstatus[currentCol] = 1 else: val = True self.col2checkstatus[currentCol] = 0 objects = self.list.GetObjects() if currentCol == 1: for obj in objects: obj.state1 = val elif currentCol == 2: for obj in objects: obj.state2 = val self.list.SetObjects(objects) self.list.RefreshObject(objects) self.Thaw() if currentCol == 1 or currentCol == 2: a = P4Rm() objects = self.list.GetObjects() len_sp = len(a.ParamDict['sp']) len_dwp = len(a.ParamDict['dwp']) check_sp = [] check_dwp = [] i = 0 for obj in objects: if i < len_sp: check_sp.append(obj.state1) if i < len_dwp: check_dwp.append(obj.state2) i += 1 P4Rm.ParamDict['state_sp'] = check_sp P4Rm.ParamDict['state_dwp'] = check_dwp def GetOLVColClicked(self, event): """ [email protected] 2011-01 Jan-13 For use with a 3rd party module named ObjectListView used with wxPython. """ spt = wx.GetMousePosition() fpt = self.list.ScreenToClient(spt) x, y = fpt last_col = 0 for col in range(self.list.GetColumnCount()): col_width = self.list.GetColumnWidth(col) left_pxl_col = last_col right_pxl_col = last_col + col_width - 1 if left_pxl_col <= x <= right_pxl_col: col_selected = col break col_selected = None last_col = last_col + col_width return col_selected def OnSize(self, event): sizet = event.GetSize() print("%s, %s" % (sizet.width, sizet.height)) event.Skip()