def __init__( self, parent, id=wx.ID_ANY, position=wx.DefaultPosition, size=wx.DefaultSize, tabela="", colunas=[], tupla=() ): wx.Frame.__init__(self, parent, id, tabela, wx.DefaultPosition, size) sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) self.tabela = tabela self.tupla = tupla self.colunas = colunas obs = dbManager.RESTRICOES[tabela] tuplaAtual = mostraTupla(self, size=wx.Size(size.GetWidth(), 100), tupla=tupla, colunas=colunas) sizer.Add(tuplaAtual) # lista de campos de input self.campos = [] for c in colunas: observacao = obs.get(c[0]) # Nada de ignorar, comportamento básico: "Label [ctrl]" if not (observacao in ("ignore", "seq", "pk") or type(observacao) is int): txt = wx.StaticText(self, wx.ID_ANY, "Novo " + dbManager.getColunaBonita(c[0])) ## Cada tipo de dados pede um input diferente, digo bora ## # Número: IntCtrl, com máximo e mínimo if c[1] is cx_Oracle.NUMBER: ctrl = IntCtrl(self, min=0, max=c[4] and 10 ** c[4] or None) # Data: DatePickerCtrl, pq né elif c[1] is cx_Oracle.DATETIME: ctrl = meuDatePicker(self) # Enum (CHAR/VARCHAR2 com CHECK): Choice com as possibilidades elif type(observacao) is tuple: ctrl = wx.Choice(self, choices=observacao) # String (CHAR/VARCHAR2): TextCtrl else: ctrl = wx.TextCtrl(self) # adiciona o "Label [ctrl]" no BoxSizer, pra ficar tudo bonitão hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add(txt, flag=wx.CENTER | wx.RIGHT, border=10) hbox.Add(ctrl, proportion=1) sizer.Add(hbox, flag=wx.EXPAND) # salva na lista, pra podermos pegar depois self.campos.append((c, ctrl)) # Se não tem campos a atualizar, deixa quieto if len(self.campos) == 0: raise Exception("Tabela não permite atualizações") cancelButton = wx.Button(self, self.ID_CANCELA, "Cancelar") self.Bind(wx.EVT_BUTTON, self.onCancel, id=self.ID_CANCELA) atualizaButton = wx.Button(self, self.ID_ATUALIZA, "Atualizar") self.Bind(wx.EVT_BUTTON, self.onAtualiza, id=self.ID_ATUALIZA) # põe os dois botões na mesma linha hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add(atualizaButton, flag=wx.RIGHT, border=50) hbox.Add(cancelButton, flag=wx.LEFT, border=50) sizer.Add(hbox, flag=wx.ALIGN_CENTER | wx.TOP, border=10, proportion=1)
def __init__(self, parent, id=wx.ID_ANY, position=wx.DefaultPosition, size=wx.DefaultSize, colunas=[], tupla=()): wx.ListCtrl.__init__(self, parent, id, position, size, wx.LC_REPORT | wx.LC_VIRTUAL) self.tupla = tupla self.colunas = colunas # tamanhos calculados width = len(colunas) columnWidth = self.GetSize().GetWidth() / width # insere as colunas for i, c in enumerate(colunas): self.InsertColumn(i, dbManager.getColunaBonita(c[0]), width=columnWidth) self.SetItemCount(1)
def setValues (self, colunas, valores): """Troca os valores atuais listados""" # limpa primeiro self.ClearAll () # salva os valores pra tabela self.colunas = colunas self.valores = valores height = len (valores) width = len (colunas) columnWidth = self.GetSize ().GetWidth () / width # insere as colunas for i, c in enumerate (colunas): self.InsertColumn (i, dbManager.getColunaBonita (c[0]), width = columnWidth) self.SetItemCount (height)
def __init__ (self, parent, id, position, size, tabela, obs = {}): """Ctor. 'obs' é um dicionário que mostra algumas observações sobre alguns campos (por nome), como por exemplo CONSTRAINTs de vários tipos. Observações possíveis (a partir do tipo/valor): 'ignore' - ignora campo (tupla) - enum, lista de valores fixos (bom pra quando tem CHECK IN) """ wx.Panel.__init__ (self, parent, id, position, size) self.tabela = tabela self.db = dbManager.getDbManager () colunas = self.db.getTableInfo (tabela) #print colunas self.campos = [] sizer = wx.BoxSizer (wx.VERTICAL) self.SetSizer (sizer) # primeira coisa (se tiver), põe as opções de FKs if obs.get ('fks'): # nossa lista de campos dependentes de FK self.fkCtrlList = [] self.fks = obs['fks'] self.fkChoices = [] for i, fk in enumerate (self.fks): # descobre quais são as possíveis fks, e mostra pa nóis txt = wx.StaticText (self, wx.ID_ANY, 'FK ' + fk.descricao) chaves = fk.getKeys () ctrl = wx.Choice (self, id = self.ID_FK + i, choices = chaves) self.fkChoices.append (ctrl) # e adiciona no BoxSizer hbox = wx.BoxSizer (wx.HORIZONTAL) hbox.Add (txt, flag = wx.CENTER | wx.RIGHT, border = 10) hbox.Add (ctrl, proportion = 1) sizer.Add (hbox, flag = wx.EXPAND) # adiciona uma posição no fkCtrls self.fkCtrlList.append ([]) self.Bind (wx.EVT_CHOICE, self.atualizaFks, id = self.ID_FK + i) for c in colunas: observacao = obs.get (c[0]) # Nada de ignorar, comportamento básico: "Label [ctrl]" if observacao != 'ignore': txt = wx.StaticText (self, wx.ID_ANY, dbManager.getColunaBonita (c[0]) + (observacao == 'seq' and ' (seq)' or '')) ## Cada tipo de dados pede um input diferente, digo bora ## # Número: IntCtrl, com máximo e mínimo if c[1] is cx_Oracle.NUMBER: if observacao == 'seq': ctrl = sequenceCtrl (self, tabela = tabela) else: ctrl = IntCtrl (self, min = 0, max = c[4] and 10 ** c[4] or None) # Data: DatePickerCtrl, pq né elif c[1] is cx_Oracle.DATETIME: ctrl = wx.DatePickerCtrl (self) # Enum (CHAR/VARCHAR2 com CHECK): Choice com as possibilidades elif type (observacao) is tuple: ctrl = wx.Choice (self, choices = observacao) ctrl.SetSelection (0) # String (CHAR/VARCHAR2): TextCtrl else: ctrl = wx.TextCtrl (self) # FKs: salva o Ctrl na lista de Ctrls das FKs if type (observacao) is int: # salva o Ctrl, pra que possamos completar quando as FKs # forem selecionadas self.fkCtrlList[observacao].append (ctrl) # adiciona o "Label [ctrl]" no BoxSizer, pra ficar tudo bonitão hbox = wx.BoxSizer (wx.HORIZONTAL) hbox.Add (txt, flag = wx.CENTER | wx.RIGHT, border = 10) hbox.Add (ctrl, proportion = 1) sizer.Add (hbox, flag = wx.EXPAND) # salva na lista, pra podermos pegar depois self.campos.append ((c[0], ctrl)) # nosso botão de inserir tupla addButton = wx.Button (self, self.ID_INSERT, label = 'Inserir') sizer.Add ((-1, 20)) sizer.Add (addButton, flag = wx.ALIGN_CENTER) self.Bind (wx.EVT_BUTTON, self.insere, id = self.ID_INSERT)