首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

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

2012-08-21 
wxpython wx.grid 使用小技巧 【无法拖动列的内容 demo是可以的】?# -*- coding: cp936 -*-import wximport

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

?

# -*- coding: cp936 -*-import wximport wx.gridimport wx.lib.gridmovers   as gridmoversimport pymssqlconnect=pymssql.connect(host='wxpython',user='sa',password='',database='THIS4_0807')cursor=connect.cursor()ascordesc=Trueclass 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

热点排行