在遍找可以拖拽设计wxPython窗体没找到如意的后,只有把wxPython学一学了,一个简单的项目完成后,总结一些小心得:
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,唯一的区别就是可以少打两个字)
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要好用
#-*- 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一下。。。希望有更靠谱的做法