wxPython應用心得

來源:互聯網
上載者:User

在遍找可以拖拽設計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一下。。。希望有更靠譜的做法    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.