`
dqifa
  • 浏览: 116444 次
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    wxPython电子表格功能wx.grid实例教程

    在本教程中,我们将深入探讨如何使用wxPython库中的`wx.grid`模块来创建和操作电子表格。`wxPython`是Python中一个流行的GUI(图形用户界面)工具包,而`wx.grid`提供了用于构建电子表格组件的功能。下面将详细介绍`...

    wxPython2.8.12.1(Linux)

    wxPython2.8.12.1的Linux版本,需要在Linux版本上安装的可以试一下。

    wxPython-demo-4.2.0.tar.gz 应用示例

    wxPython demo 4.2 应用示例 pip install wxpython==4.2 cd \Python37\Scripts wxdemo.exe 下载 wxPython-demo-4.2.0.tar.gz

    wxPython-4.0.7.post2.tar.gz

    通过`wxPython-4.0.7.post2`,开发者或测试工程师可以确保他们正在使用的`wxPython`版本与`Robot Framework`中的`wxRobot`库兼容,从而高效地进行GUI测试。 **核心特性** `wxPython`提供了大量组件,如按钮、...

    wxpython控件之Listctrl

    ### wxPython中的ListCtrl控件详解 #### 一、引言 `ListCtrl`是wxPython库中的一个重要组件,用于创建列表控件。它可以展示多种类型的列表格式,如单列表、报表、带图片的列表等,并且具备强大的自定义功能。本文将...

    wxPython.API参考手册chm

    6. **国际化和本地化**: wxPython支持多语言应用,通过`wx.Locale`和`wx.MessageDialog`可以轻松实现。 **使用API参考手册** 手册中的每个类都详细列出了其构造函数、方法、属性和常量。例如,`wx.Frame`类是顶级...

    wxpython利用table展示表格支持增、删、改、查

    在wxPython中,`wx.grid`模块提供了GridTableBase和Grid类,用于展示和操作表格数据。GridTableBase是一个抽象基类,定义了表格的数据模型,而Grid类则负责显示表格并处理用户交互。 3. **自定义表格模型** 要...

    python用WxPython库实现无边框窗体和透明窗体实现方法详解

    在Python编程中,GUI(图形用户界面)是一个重要的部分,特别是在需要与用户进行交互的应用...对于更深入的学习,可以参考提供的相关链接,这些链接包含更多WxPython的使用方法和实例,涵盖从基础到高级的各种主题。

    wxPython-demo-4.0.6官方demo

    **wxPython-demo-4.0.6官方demo**是一个用于学习和探索wxPython库的资源包,其中包含了大量示例代码,旨在帮助开发者理解和运用wxPython进行GUI(图形用户界面)编程。wxPython是一个跨平台的GUI工具包,它允许...

    Python wxPython库使用wx.ListBox创建列表框示例

    本文将深入探讨如何使用wxPython中的wx.ListBox类来创建和管理列表框。 列表框是一种用户界面元素,允许用户从一组预定义的选项中进行选择。在wxPython中,wx.ListBox是用来创建列表框的类。下面我们将详细讲解如何...

    wxpython 设计日历控件.rar

    在Python的GUI编程中,wxPython是一个非常流行的库,它为开发者提供了丰富的界面组件和工具,使得创建桌面应用程序变得简单。本项目聚焦于利用wxPython设计一个日历控件,这个控件允许用户选择日期,并能打印所选...

    wxPython-demo-2.8.10.1.tar.bz2

    wxPython2.8 是 Python 窗口显示的框架,很多软件需要通过该框架提供窗口显示、操作等功能。

    wxPython中文教程.doc

    【wxPython】是一个基于Python语言的图形用户界面(GUI)工具包,它使用原生的窗口系统来构建应用程序,提供了一种跨平台的方式来创建桌面应用。wxPython是wxWidgets库的Python绑定,允许开发者利用其丰富的组件库和...

    wxPython-demo-2.6.0.0.tar.gz

    通过学习这个压缩包中的内容,开发者可以深入理解wxPython的工作原理,熟悉控件的使用方式,掌握如何设计用户界面,以及如何处理用户交互事件。这对于那些希望利用Python进行桌面应用开发的人来说是非常有价值的资源...

    wxpython子模块wx.lib.agw.aui实现可拖动有抓取柄工具栏示例源代码

    2. **创建面板和工具栏**:工具栏通常是一个独立的 `wx.Panel`,在其上可以添加多个按钮或其他控制项,提供用户常用功能。3. **设置停靠和浮动特性**:通过管理器的方法,可以定义工具栏的行为。例如,可以选择将其...

    wxPython-4.0.1.tar.gz

    **使用wxPython**时,你需要导入相应的模块,比如`wx`,然后创建应用程序实例,定义窗口布局和事件处理。以下是一个简单的示例: ```python import wx class MyFrame(wx.Frame): def __init__(self, parent, ...

    wxPython-demo-4.0.3.tar:wxPython官方demo

    wxPython是Python编程语言中一个强大的GUI(图形用户界面)工具包,它使得开发者可以使用Python编写出具有本地外观和感觉的应用程序。wxPython是基于C++的wxWidgets库的Python绑定,提供了丰富的控件集合,使得...

    wxPython-入门教程.pdf

    因此,使用wxPython进行GUI开发时,开发者可以充分利用Python的面向对象特性,不必因为选择Python而放弃对面向对象编程的享受。 【基础代码示例】清单1展示了一个简单的wxPython应用代码片段: 1. 首先,导入了...

Global site tag (gtag.js) - Google Analytics