博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wxPython应用心得
阅读量:5934 次
发布时间:2019-06-19

本文共 4172 字,大约阅读时间需要 13 分钟。

在遍找可以拖拽设计wxPython窗体没找到如意的后,只有把wxPython学一学了,一个简单的项目完成后,总结一些小心得:

  • StaticText控件改变里面的内容用SelLabel方法

 

  • 整体布局用GridBagSizer,因为你只要告诉sizer你把某个控件插在哪一行哪一列,同时告知横跨多少行多少列即可
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,唯一的区别就是可以少打两个字)

    • 一行布局用FlexGridSizer
      很遗憾,一个一个的元素想要像html一样地流式排开是不可能的,所以哪怕是几个简单的控件,也是要用布局控件的,不然只有绝对定位了,不定位或布局的话,所有控件会出现在(0,0)的位置。。。
      FlexGridSizer的好处在于每列宽度可以不一样,这样你只要元素一个个地丢到格子里,格子的大小会随着里面控件的大小而自动调整,这就类似于“流式布局”了
      形如 第3/8页 首页 上一页 下一页 末页 的分页工具条:
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要好用
  • 关于Layout()方法:
    很多情况下控件内容改了,需要强制调用Layout方法来重新布局,比如上面的分页条,第3/1506页,是紧紧挨在一起的,其实是三个label,一旦你翻页到了最后一页,3变成1506,你会发现根本看不清,因为它的宽度还是”3“的宽度,SetLabel()后再Layout(),你会发现宽度自然变了

  • 关于表格和“数据源”
    .net编程过来的喜欢用“数据源”的概念
    大量数据的呈现在wxPython里面用的是Grid,最简单的用法是CreateGrid,然后再给单元格赋值,这种情况显然不适合分页数据,Grid里面可以随时改变一个Grid里面数据的方法就是SetTable()
    使用SetTable()方法的关键在于要做好一个"Table",我是这么做的:
#-*- encoding:UTF-8 -*-import wximport 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一下。。。希望有更靠谱的做法

转载于:https://www.cnblogs.com/walkerwang/archive/2011/08/25/2153511.html

你可能感兴趣的文章
keepalived+lvs实现mysql集群读的操作(写类似)
查看>>
Elasticsearch from+size 超过10000结果解决方案(V 2.x)
查看>>
php学习笔记--序
查看>>
再次学习的回忆
查看>>
我的友情链接
查看>>
LINUX下网站维护命令
查看>>
F5+IIS7.5 SNAT日志记录真实源IP
查看>>
【 Visual C++】游戏开发笔记之二——最简单的DirectX,vc窗口的编写
查看>>
我的友情链接
查看>>
LDAP架构部署认证
查看>>
Linux网络抓包分析工具Tcpdump基础篇[参数说明]
查看>>
00_02启动tomcat时 一闪而过解决方法
查看>>
WSUS 客户端无法提示更新!
查看>>
在处理文件服务器上的文件时文件服务器性能下降并出现延迟
查看>>
shell 文本过滤
查看>>
几个有用的VBS
查看>>
线上nginx的一次“no live upstreams while connecting to upstream ”分析
查看>>
为什么开源中国APP4.0版的排版让我感觉有些乱
查看>>
Traffic Analysis of an SSL/TLS Session
查看>>
Debian 7.0 amd64安装ia32-libs
查看>>