wxpython wx.grid 使用小技巧 【无法拖动列的内容 demo是可以的】

 

# -*- coding: cp936 -*-
import wx
import wx.grid
import wx.lib.gridmovers   as gridmovers

import pymssql
connect=pymssql.connect(host='wxpython',user='sa',password='',database='THIS4_0807')
cursor=connect.cursor()
ascordesc=True

class LineupTable(wx.grid.PyGridTableBase):
    def __init__(self,data,fields):
        wx.grid.PyGridTableBase.__init__(self)
        self.data=data
        self.fields=fields
##        self.dataTypes = [wx.grid.GRID_VALUE_STRING,
##                          wx.grid.GRID_VALUE_STRING,
##                          #gridlib.GRID_VALUE_CHOICE + ':only in a million years!,wish list,minor,normal,major,critical',
##                          #gridlib.GRID_VALUE_NUMBER + ':1,5',
##                          #gridlib.GRID_VALUE_CHOICE + ':all,MSW,GTK,other',
##                          #gridlib.GRID_VALUE_BOOL,
##                          #gridlib.GRID_VALUE_BOOL,
##                          #gridlib.GRID_VALUE_BOOL,
##                          wx.grid.GRID_VALUE_FLOAT + ':6,2',
##                          ]

        #---Grid cell attributes

        self.odd = wx.grid.GridCellAttr()
        self.odd.SetBackgroundColour("grey")
        self.odd.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD))

        self.even = wx.grid.GridCellAttr()
        self.even.SetBackgroundColour("white")
        self.even.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD))
       

    #---Mandatory constructors for grid


    def GetNumberRows(self):
       # if len(self.data)<10:
           # rowcounts=10
        #else:
            #rowcounts=len(self.data)
        return len(self.data)

    def GetNumberCols(self):
        return len(self.fields)

    def GetColLabelValue(self, col):
        return self.fields[col]

    def IsEmptyCell(self, row, col):
        if self.data[row][col] == "" or self.data[row][col] is None:
            return True
        else:
            return False

#    def GetValue(self, row, col):
#        value = self.data[row][col]
#        if value is not None:
#            return value
#        else:
#            return ''
#
#    def SetValue(self, row, col, value):
#        #print col
#        def innerSetValue(row, col, value):
#            try:
#                self.data[row][col] = value
#            except IndexError:
#                # add a new row
#                self.data.append([''] * self.GetNumberCols())
#                innerSetValue(row, col, value)
#
#                # tell the grid we've added a row
#                msg = gridlib.GridTableMessage(self,            # The table
#                        gridlib.GRIDTABLE_NOTIFY_ROWS_APPENDED, # what we did to it
#                        1                                       # how many
#                        )
#
#                self.GetView().ProcessTableMessage(msg)
#        innerSetValue(row, col, value)
        
    def GetValue(self, row, col):
        #id = self.fields[col]
        return self.data[row][col]
    
    def SetValue(self, row, col, value):
        #id = self.fields[col]
        self.data[row][col] = value
    
    #--------------------------------------------------
    # Some optional methods
    
    # Called when the grid needs to display column labels
#    def GetColLabelValue(self, col):
#        #id = self.fields[col]
#        return self.fields[col][0]
   

    def GetAttr(self, row, col, kind):
        attr = [self.even, self.odd][row % 2]
        attr.IncRef()
        return attr

    def SortColumn(self, col,ascordesc):
        """
        col -> sort the data based on the column indexed by col
        """
        name = self.fields[col]
        _data = []

        for row in self.data:
            #print row
            #rowname, entry = row
            
            _data.append((row[col], row))

        _data.sort(reverse=ascordesc)
        self.data = []

        for sortvalue, row in _data:
            self.data.append(row)

    def AppendRow(self, row):#增加行
        #print 'append'
        entry = []

        for name in self.fields:
            entry.append('A')


        self.data.append(tuple(entry ))
        return True


    def MoveColumn(self,frm,to):
        grid = self.GetView()

        if grid:
            # Move the identifiers
            old = self.fields[frm]
            del self.fields[frm]

            if to > frm:
                self.fields.insert(to-1,old)
            else:
                self.fields.insert(to,old)
            
            print self.fields

            # Notify the grid
            grid.BeginBatch()
           
            msg = wx.grid.GridTableMessage(
                    self, wx.grid.GRIDTABLE_NOTIFY_COLS_INSERTED, to, 1
                    )
            grid.ProcessTableMessage(msg)

            msg = wx.grid.GridTableMessage(
                    self, wx.grid.GRIDTABLE_NOTIFY_COLS_DELETED, frm, 1
                    )
            grid.ProcessTableMessage(msg)
            
            grid.EndBatch()
           

    # Move the row
    def MoveRow(self,frm,to):
        grid = self.GetView()

        if grid:
            # Move the rowLabels and data rows
            oldLabel = self.rowLabels[frm]
            oldData = self.data[frm]
            del self.rowLabels[frm]
            del self.data[frm]

            if to > frm:
                self.rowLabels.insert(to-1,oldLabel)
                self.data.insert(to-1,oldData)
            else:
                self.rowLabels.insert(to,oldLabel)
                self.data.insert(to,oldData)

            # Notify the grid
            grid.BeginBatch()

            msg = wx.grid.GridTableMessage(
                    self, wx.grid.GRIDTABLE_NOTIFY_ROWS_INSERTED, to, 1
                    )
            grid.ProcessTableMessage(msg)

            msg = wx.grid.GridTableMessage(
                    self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, frm, 1
                    )
            grid.ProcessTableMessage(msg)
    
            grid.EndBatch()


class DragableGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent )
        cursor.execute('select top 2 blh,hzxm,qrrq from JK_YSQR_DK ')
        data = cursor.fetchall()
        fields = [cursor.description[i][0] for i in range(len(cursor.description))]


        table = LineupTable(data,fields)
        self.SetTable(table, True)
        #table = LineupTable()

        # The second parameter means that the grid is to take ownership of the
        # table and will destroy it when done. Otherwise you would need to keep
        # a reference to it and call it's Destroy method later.
        #self.SetTable(self.table, True)

        # Enable Column moving
        gridmovers.GridColMover(self)
        self.Bind(gridmovers.EVT_GRID_COL_MOVE, self.OnColMove, self)

        # Enable Row moving
        gridmovers.GridRowMover(self)
        self.Bind(gridmovers.EVT_GRID_ROW_MOVE, self.OnRowMove, self)

    # Event method called when a column move needs to take place
    def OnColMove(self,evt):
        frm = evt.GetMoveColumn()       # Column being moved
        to = evt.GetBeforeColumn()      # Before which column to insert
        self.GetTable().MoveColumn(frm,to)
       

    # Event method called when a row move needs to take place
    def OnRowMove(self,evt):
        frm = evt.GetMoveRow()          # Row being moved
        to = evt.GetBeforeRow()         # Before which row to insert
        self.GetTable().MoveRow(frm,to)


class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, id=-1, title='wx.grid.PyGridTableBase',size=(900,600))

        #---Panel

        #panel = wx.Panel(self, -1)

        #---Buttons

        self.btn_1hr = wx.Button(self, -1, "RUN", pos=(10, 10),size=(100,40))
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn_1hr)

        self.btn_2hr = wx.Button(self, -1, "ADD", pos=(10, 35),size=(100,40))
        self.Bind(wx.EVT_BUTTON, self.OnADD, self.btn_2hr)
        self.btn_3hr = wx.Button(self, -1, "DELETE", pos=(10, 60),size=(100,40))

        self.btn_4hr = wx.Button(self, -1, "INSERT", pos=(10, 85),size=(100,40))

        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.btn_1hr, 1, wx.EXPAND,5)
        box.Add(self.btn_2hr, 1, wx.EXPAND,5)
        box.Add(self.btn_3hr, 1, wx.EXPAND,5)
        box.Add(self.btn_4hr, 1, wx.EXPAND,5)

        #---Grid

        self.grid =DragableGrid(self)#, pos=(140, 0), size=(900,400))
        self.grid.SetRowLabelSize(40)#设置行标签的宽度
        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.OnLabelRightClick)
        #self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.OnRangeSelect)
        box1 = wx.BoxSizer(wx.VERTICAL)
        box1.Add(self.grid, 1, wx.GROW|wx.ALL)
        cursor.execute('select top 2 blh,hzxm,qrrq from JK_YSQR_DK ')
        data = cursor.fetchall()
        fields = [cursor.description[i][0] for i in range(len(cursor.description))]


        self.table = LineupTable(data,fields)
        self.grid.SetTable(self.table, True)



        #---Grid properties

        self.grid.EnableEditing(True)#是否可以编辑
        self.grid.SetDefaultCellAlignment(wx.ALIGN_LEFT, wx.ALIGN_RIGHT)#设置CELL的文本对齐方式
        self.grid.SetSelectionBackground('red')
        self.grid.EnableDragColSize(enable=True)#控制列宽是否可以拉动
        self.grid.EnableDragRowSize(enable=True)#控制行高是否可以拉动
        self.grid.SetLabelBackgroundColour((100, 200, 150))
        self.grid.SetLabelTextColour((255, 255, 255))

        #---Column Sizes
        self.grid.AdjustScrollbars()
        self.grid.Refresh()

        Hbox = wx.BoxSizer(wx.HORIZONTAL)
        Hbox.Add(box, 0, wx.EXPAND)
        Hbox.Add(box1, 1, wx.EXPAND)
        #Vbox = wx.BoxSizer(wx.VERTICAL)
        #Vbox.Add(Hbox,0,wx.ALL|wx.EXPAND)
        
        self.SetSizer(Hbox)
        #self.Fit()
        #self.grid.AutoSize()

        #---Use below if want to size individual columns (index, size)
        #---Also have SetRowSize
        #grid.SetColSize(0, 150)


     


    def Reset(self):
        """reset the view based on the data in the table. Call
        this when rows are added or destroyed"""
        self.table.ResetView(self)


    def OnLabelRightClick(self, event):
        global ascordesc,row, col
        
        #self.SetStatusText('You Have Right-Clicked On Label "%s"!' % event.GetString())
        row, col = event.GetRow(), event.GetCol()
        #print row, col
        self.table.SortColumn(col,ascordesc)
        if ascordesc:
            ascordesc=False
        else:
            ascordesc=True
        
            
        self.grid.Refresh()

    def OnADD(self,event):
        
        
        #self.table.AppendRow(row)
        #print (self.grid.SelectedRows)
        self.table.AppendRow(row)
        #self.grid.SetTable(self.table, True)
        self.grid.ForceRefresh()

    def OnClick(self, event):

        cursor.execute('select top 5 id as "编码",name as "名称" ,cast(memo as numeric(12,2)) as "单价" from YY_SFDXMK where memo>0')
        data1 = cursor.fetchall()
        fields1 = [cursor.description[i][0] for i in range(len(cursor.description))]
               
        self.table = LineupTable(data1,fields1)
        self.grid.SetTable(self.table, True)
        self.grid.EnableDragColSize(enable=True)
        self.grid.EnableDragRowSize(enable=True)
        #self.grid.AutoSize()
        self.grid.AdjustScrollbars()
        #self.grid.ForceRefresh()
        self.grid.Refresh()




       


if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

  

 

from:http://hi.baidu.com/wxpythondk/blog/item/b881426121b12842eaf8f84b.html

你可能感兴趣的:(python,grid)