wxPython应用心得

在遍找可以拖拽设计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 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 rowin datasource:
            j=0
            for k,vin 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 valueis 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一下。。。希望有更靠谱的做法

时间: 2024-10-23 22:10:25

wxPython应用心得的相关文章

#这个测试程序有助于我们理解wxPython的界面设计,基本的控件和事件调用都有

#!/bin/env python # -*- coding: utf-8 -*- ################################################################################# #这个测试程序有助于我们理解wxPython的界面设计,基本的控件和事件调用都有 ################################################################################# imp

Delphi组件indy 10中IdTCPServer修正及SSL使用心得

indy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰.Indy9发展到了indy10几乎完全不兼容,可叹啊.言归正传.在使用IdTCPServer组件的时候发现了他的漏洞,他的OnConnec,OnExecute,OnDisconnect等事件是在其他线程中执行的,通常情况下这没有问题,但是在特殊的情况下会造成问题,如果其他部分的程序写得有问题就会出现漏洞.

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

参加老男孩linux培训心得

参加老男孩linux培训心得 时间如白驹过隙,已经不知不觉来到老男孩培训已经三个月了.在这三个月中我渐渐得到了成长,专业技术成长,以及为人处事之道与思想的提高. 我一共就总结以下了三点     一.思想 在我刚来老男孩的时候,老师天天上课前讲一段思想,我当时不太明白,不赶紧上课,讲这干啥呢?而且老师早一点讲完,又可以招下一批学生了,老讲思想,这不是自断财路么?随着时间的流逝,渐渐的我悟懂了点.人在那里都可以学技术,但是学会了技术没有思想,一旦来了新事物,就会接受的很慢.尤其在互联网这个圈子里,软

Linux串口IO模式的一些心得

众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样. 通常I/O操作都是有阻塞与非阻塞的两种方式. 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux中串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种: 阻塞 --> 超时 阻塞 --> 非阻塞 超时 --> 阻塞 超时 --> 非阻塞 非阻塞 --> 阻塞 我们一个一个来分析 首先在一个串口的

我的MYSQL学习心得(八)

我的MYSQL学习心得(八) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 这一篇<我的MYSQL学习心得(七)>将会讲解MYSQL的插入.更新和删除语句 同样的,只会讲解跟SQLSERVER不同的地方 插入 将多行查询结果插入到表中 语法 INSERT INTO table_name1(column_list1) SELECT (

《不要让我思考》读后心得2

---内容开始--- Don't let me think! 这本书以网站可用性为目的,从作者自身工作和经验角度,站在用户的心理立场上,介绍了作为设计者如何做出可用性的web设计. 其中包含的内容有: 1.别让我思考(定律) 当看到一个不需要思考的网站时: 当看到一个要思考的网站时: @创建一个网站时,要去掉这些问号. 有时候网站会强迫我们思考,名字,常见的罪魁祸首就是改成自以为很酷很聪明的,带有营销色彩的名字. 还有另一个来源是看起来不太明显的链接和按钮,会造成用户犹豫可不可点. @类似的例子

【管理心得之二十二】小人物 仰视 大授权

场景再现====================Boss:小王,来我办公室一下.小王: 嗯Boss:近期总公司有会,需要到外地出差几日.我不在的这段期间里,公司大小事务你帮忙处理一下.          如果有什么难决定的事,第一时间电话.邮件联系我商定即可.小王:  明白.放心吧领导,绝不会让你失望的Boss:嗯,那就好,没事了. {小王走出办公室} 心中暗喜,"难道这就是传说中的授权,Boss不在的时候,我岂不是最高权力的行使者." ==================== 从场景

python 爬虫抓取心得

quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quote('要编码的字符串') query = urllib.quote(singername) url = 'http://music.baidu.com/search?key='+query response = urllib.urlopen(url) text = response.read()