Receita: BoaConstructor eventos e grid
Um simples uso do wx com boa-constructor que mostra como utilizar o evento onclick do mouse, mudança de conteúdo de caixas de textos e utilização de grids.
módulo principal da aplicação
A maioria dos códigos já são gerados automaticamente pelo boa, porém existem algumas incompatibilidades que vou comentar adiante.
1 #Boa:App:BoaApp
2
3 import wx
4
5 import Frame1
6 #o frame2 em modules foi adicionado mas não possui muita finalidade
7 modules ={'Frame1': [1, 'Main frame of Application', 'Frame1.py'],
8 'Frame2': [0, 'Grid', 'Frame2.py']}
9
10 class BoaApp(wx.App):
11 def OnInit(self):
12 wx.InitAllImageHandlers()
13 self.main = Frame1.create(None)
14 self.main.Show()
15 self.SetTopWindow(self.main)
16 return True
17
18 def main():
19 application = BoaApp(0)
20 application.MainLoop()
21
22 if __name__ == '__main__':
23 main()
Primeiro Frame
1 #Boa:Frame:Frame1
2
3 import wx
4 #importar o 2ºFrame
5 import Frame2
6
7 def create(parent):
8 return Frame1(parent)
9
10 [wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1PANEL1,
11 wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1TEXT1,
12 wxID_FRAME1TEXT2,
13 ] = [wx.NewId() for _init_ctrls in range(8)]
14
15 class Frame1(wx.Frame):
16 def _init_ctrls(self, prnt):
17 # generated method, don't edit
18 #metodo gerenciado pelo boa, usado para construir os componentes para visualização e
19 #edição, o boa vai excluir este comentário ao visualizar o Frame
20 wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
21 pos=wx.Point(427, 265), size=wx.Size(289, 182),
22 style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
23 self.SetClientSize(wx.Size(281, 155))
24
25 self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
26 pos=wx.Point(0, 0), size=wx.Size(281, 148),
27 style=wx.TAB_TRAVERSAL)
28
29 self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1,
30 label='label1', name='staticText1', parent=self.panel1,
31 pos=wx.Point(48, 24), size=wx.Size(28, 13), style=0)
32
33 self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2,
34 label='label2', name='staticText2', parent=self.panel1,
35 pos=wx.Point(168, 24), size=wx.Size(28, 13), style=0)
36
37 self.text2 = wx.TextCtrl(id=wxID_FRAME1TEXT2, name='text2',
38 parent=self.panel1, pos=wx.Point(160, 40), size=wx.Size(100, 21),
39 style=0, value='DEF')
40
41 self.text1 = wx.TextCtrl(id=wxID_FRAME1TEXT1, name='text1',
42 parent=self.panel1, pos=wx.Point(40, 40), size=wx.Size(100, 21),
43 style=0, value='abc')
44 #cria um botão
45 self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='executar',
46 name='button1', parent=self.panel1, pos=wx.Point(48, 96),
47 size=wx.Size(75, 23), style=0)
48 self.button1.SetToolTipString('executar')
49 #declara evento de um botão
50 self.button1.Bind(wx.EVT_BUTTON, self.OnButton1Button,
51 id=wxID_FRAME1BUTTON1)
52
53 self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='Grid',
54 name='button2', parent=self.panel1, pos=wx.Point(160, 96),
55 size=wx.Size(75, 23), style=0)
56 self.button2.Bind(wx.EVT_BUTTON, self.OnButton2Button,
57 id=wxID_FRAME1BUTTON2)
58
59 def __init__(self, parent):
60 self._init_ctrls(parent)
61
62 #ao clicar no botão 1
63 def OnButton1Button(self, event):
64 #existem vários métodos de trabalhar com os valores de caixa de textos,
65 #optei por estes por parecerem bem simples
66 a = self.text1.GetValue()
67 b = self.text2.GetValue()
68 self.text1.SetValue(b)
69 self.text2.SetValue(a)
70
71 #ao clicar no botão 2
72 def OnButton2Button(self, event):
73 #igualzin no Delphi :)
74 frm2 = Frame2.create(None)
75 frm2.Show()
segundo frame
Também existem vários métodos de trabalho com grids, o createGrid, o mais simples em minha opinião, acabou ficando com um bug no boa, mas funciona perfeitamente na execução.
Para poder visuallizar o grid no boa, deixei a chamada do método createGrid fora do método _init_ctrls do frame,se bem que não dá pra editar muitas propriedades da forma que eu fiz, pois os dados ainda serão buscados de uma fonte qualquer, e o tamanho dos campos se adequarão automaticamente.
1 #Boa:Frame:Frame2
2
3 import wx
4 import wx.grid
5 import wx.calendar
6
7 def create(parent):
8 return Frame2(parent)
9
10 [wxID_FRAME2, wxID_FRAME2CALENDARCTRL1, wxID_FRAME2GRID1, wxID_FRAME2PANEL1,
11 ] = [wx.NewId() for _init_ctrls in range(4)]
12
13 class Frame2(wx.Frame):
14 def _init_ctrls(self, prnt):
15 # generated method, don't edit
16 wx.Frame.__init__(self, id=wxID_FRAME2, name='', parent=prnt,
17 pos=wx.Point(70, 40), size=wx.Size(892, 685),
18 style=wx.DEFAULT_FRAME_STYLE, title='Grid')
19 self.SetClientSize(wx.Size(884, 658))
20
21 self.panel1 = wx.Panel(id=wxID_FRAME2PANEL1, name='panel1', parent=self,
22 pos=wx.Point(0, 0), size=wx.Size(884, 658),
23 style=wx.TAB_TRAVERSAL)
24 #coloquei um calendário só porque achei fácil
25 self.calendarCtrl1 = wx.calendar.CalendarCtrl(date=wx.DateTime.Now(),
26 id=wxID_FRAME2CALENDARCTRL1, name='calendarCtrl1',
27 parent=self.panel1, pos=wx.Point(16, 16), size=wx.Size(172, 137),
28 style=wx.calendar.CAL_SHOW_HOLIDAYS)
29
30 self.grid1 = wx.grid.Grid(name='grid1', parent=self.panel1,
31 pos=wx.Point(16, 168), size=wx.Size(100, 100), style=1)
32
33 def __init__(self, parent):
34
35 self._init_ctrls(parent)
36 self.grid1.CreateGrid(1, 1, self.grid1.wxGridSelectCells)
37 dados = self.dados()
38 #criação de celulas, de tamanho correspondente aos dados que se quer visualizar
39 self.grid1.AppendCols(len(dados[1])-1)
40 self.grid1.AppendRows(len(dados)-1)
41 #preenchimento das células
42 for registro in range(len(dados)):
43 for dado in range(len(dados[registro])):
44 self.grid1.SetCellValue(registro , dado, dados[registro][dado])
45 #Também existe o SetRowLabelValue
46 self.grid1.SetColLabelValue(0,'label')
47 self.grid1.AutoSize()
48
49 def dados(self):
50 import seuJeitoDeObterDados.obterDados as obterDados
51 #retorna uma lista de listas.Ex:
52 #[['Josivaldo','22','M','aux.adm.'],['Marlene','19', 'F','secretária'],['Simone','20','F','Enc.DP']]
53 _dados = str(obterDados.obter())
54 return _dados
Volta para CookBook.
saviorangel