标签:
在遍找可以拖拽设计wxPython窗体没找到如意的后,只有把wxPython学一学了,一个简单的项目完成后,总结一些小心得:
1
2
3
4
5
|
bag = wx.GridBagSizer( 5 , 5 ) #生成行列间距为5的布局控件 bag.Add(btn1,pos = ( 0 , 0 )) #第1行第一列加入一个按钮 bag.Add(label1,pos = ( 0 , 1 ),span( 1 , 3 ),flag = wx.LEFT|wx.RIGHT|wx.GROW,border = 10 ) #第一行第二列加入一个label,并且横跨3列,并且左右边距为10像素,注意wx.LEFT等参数其实是作用于border参数的,请仔细理解这一个例子 #同时根据窗口大小自动填充(GROW等同于EXTEND,唯一的区别就是可以少打两个字) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def getPager( self ): #工具条所需要的控件:label和button pt1 = wx.StaticText( self , - 1 , "第" ) pt2 = wx.StaticText( self , - 1 , "/" ) pt3 = wx.StaticText( self , - 1 , "页" ) lblPageIndex = wx.StaticText( self , - 1 , "0" ) lblPageCount = wx.StaticText( self , - 1 , "0" ) btnFirst = wx.BitmapButton( self , - 1 ,myres.getfirstBitmap(),style = 0 ,size = ( 15 , 15 )) #用图片做按钮,style=0可以让图片无边框 btnLast = wx.BitmapButton( self , - 1 ,myres.getlastBitmap(),style = 0 ,size = ( 15 , 15 )) btnPrev = wx.BitmapButton( self , - 1 ,myres.getprevBitmap(),style = 0 ,size = ( 15 , 15 )) btnNext = wx.BitmapButton( self , - 1 ,myres.getnextBitmap(),style = 0 ,size = ( 15 , 15 )) #生成sizer,把控件丢进去 fg = wx.FlexGridSizer(hgap = 2 ,vgap = 2 ) #单元格间隔为2 gb.Add(pt1, 0 , 0 ) gb.Add(lblPageIndex, 0 , 1 ) gb.Add(pt2, 0 , 2 ) gb.Add(lblPageCount, 0 , 3 ) gb.Add(pt3, 0 , 4 ) gb.Add(btnFirst, 0 , 5 ) #如此反复 #比BoxSizer要好用 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#-*- encoding:UTF-8 -*- import wx import wx.grid #继承wx.Grid.PyGridTableBase即可,然后重写下面一些必要的方法 class myTable(wx.grid.PyGridTableBase): def __init__( self ,datasource): ‘‘‘ [ {colname:value,columane:value2...}, {colname:value,columane:value2...}, {colname:value,columane:value2...}, ... ] ‘‘‘ wx.grid.PyGridTableBase.__init__( self ) self .data = {} self .colLabels = datasource[ 0 ].keys() #用于生成列头的列表 self .rows = len (datasource) #行数 self .cols = len (datasource[ 0 ].keys()) #行数 i = 0 for row in datasource: j = 0 for k,v in row.items(): self .data[(i,j)] = str (v) #给每一个单元格赋值的方法 j + = 1 i + = 1 #没必要隔行换色,我就没用网上各种现成的odd和even的做法了,只设置一个属性:让超长的文字不跨到别的单元格里去(默认会跨的) self .cell = wx.grid.GridCellAttr() self .cell.SetOverflow( False ) # these five are the required methods def GetNumberRows( self ): return self .rwos def GetNumberCols( self ): return self .cols def GetColLabelValue( self ,col): #列头 return self .colLabels[col] #同样你可以实现自己的行头 GetRowLabelValue,只要return适当的值就可以了 def IsEmptyCell( self , row, col): return self .data.get((row, col)) is not None def GetValue( self , row, col): #为网格提供数据 value = self .data.get((row, col)) if value is not None : return value else : return ‘‘ def SetValue( self , row, col, value): #给表赋值 self .data[(row,col)] = value # the table can also provide the attribute for each cell def GetAttr ( self , row, col, kind): attr = self .cell attr.IncRef() #暂时没看懂 return attr ‘‘‘假如你送的数据源没有列头信息,如下: [ [value1,value2,value3,...], [value1,value2,value3,...], [value1,value2,value3,...], ... ] 你需要做的改动不过是把列头的相关代码注释掉 ‘‘‘ #使用 gv = wx.Grid() #插一点Grid的技巧: gv.SetRowLabelSize( 20 ) #默认行头很宽,设置一下,不过一旦设置了,行头的宽度就不可拖动了 gv.EnableEditing( False ) #默认表格是可以全表编辑的,这里关闭 gv.EnableDragRowSize( False ) #默认表格的每格是可以拖动高度的,这里关闭 gv.SetDefaultCellOverflow( False ) #貌似没起什么作用,所以才在table里面自行设了overflow result = myprocess.gettable() dt = myTable(result) #得到数据后转化成我需要的数据源 gv.ClearGrid() #清空表格 gv.SetTable(dt) gv.Hide() gv.Show() #假如gv是之前做的,没有列头信息,这是我找到的唯一刷新列头的方法,就是hide然后show一下。。。希望有更靠谱的做法 |
标签:
原文地址:http://www.cnblogs.com/shouce/p/5510833.html