wxpython入门(八)列表和树形

wxpython入门(八)列表和树形

参考书籍
http://wiki.woodpecker.org.cn/moin/WxPythonInAction

第十三章 列表控件和管理列表项


第十四章 网格控件
wx.grid.Grid的构造函数:
wx.grid.Grid(parent, id, pos=wx.DefaultPosition,size=wx.DefaultSize, style=wx.WANTS_CHARS,
name=wxPanelNameStr)
简单示例网格,examples:

import wx
import wx.grid

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="SimpleGrid",size=(640,480))
grid = wx.grid.Grid(self)
grid.CreateGrid(50,50)
for row in range(20):
for col in range(6):
grid.SetCellValue(row,col,"cell(%d,%d)" % (row,col))
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

数据和网格分离,examples:

import wx
import wx.grid

class TestTable(wx.grid.PyGridTableBase):#定义网格表
def __init__(self):
wx.grid.PyGridTableBase.__init__(self)
self.data = { (1,1):"Here",
(2,2):"is",
(3,3):"some",
(4,4):"data",
}
self.odd=wx.grid.GridCellAttr()
self.odd.SetBackgroundColour("sky blue")
self.odd.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))

self.even=wx.grid.GridCellAttr()
self.even.SetBackgroundColour("sea green")
self.even.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))

# these five are the required methods
def GetNumberRows(self):
return 50

def GetNumberCols(self):
return 50

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.even, self.odd][row % 2]
attr.IncRef()
return attr

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="GridTable",size=(640,480))
grid = wx.grid.Grid(self)
table = TestTable()
grid.SetTable(table, True)

app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

自定义网格的标签,examples:

import wx
import wx.grid

class TestFrame(wx.Frame):
rowLabels = ["row1","row2","row3","row4","row5"]
colLabels = ["col1","col2","col3","col4","col5"]
def __init__(self):
wx.Frame.__init__(self,None,title="GridHeaders",size=(500,200))
grid = wx.grid.Grid(self)
grid.CreateGrid(5,5)
for row in range(5):
#1 start
grid.SetRowLabelValue(row, self.rowLabels[row])
grid.SetColLabelValue(row, self.colLabels[row])
#1 end
for col in range(5):
grid.SetCellValue(row,col,"(%s,%s)" % (self.rowLabels[row],self.colLabels[col]))

app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

数据和grid分离的自定义标签,examples:

import wx
import wx.grid

class TestTable(wx.grid.PyGridTableBase):
def __init__(self):
wx.grid.PyGridTableBase.__init__(self)
self.rowLabels = ["row1","row2","row3","row4","row5"]
self.colLabels = ["col1","col2","col3","col4","col5"]

def GetNumberRows(self):
return 5

def GetNumberCols(self):
return 5

def IsEmptyCell(self, row, col):
return False

def GetValue(self, row, col):
return "(%s,%s)" % (self.rowLabels[row],self.colLabels[col])

def SetValue(self, row, col, value):
pass

def GetColLabelValue(self, col):#列标签
return self.colLabels[col]

def GetRowLabelValue(self, row):#行标签
return self.rowLabels[row]

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="GridTable",size=(500,200))
grid = wx.grid.Grid(self)
table = TestTable()
grid.SetTable(table, True)
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

调账单元格的大小,examples:
import wx
import wx.grid

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="GridSizes",size=(600,300))
grid = wx.grid.Grid(self)
grid.CreateGrid(5,5)
for row in range(5):
for col in range(5):
grid.SetCellValue(row,col,"(%s,%s)" % (row,col))
grid.SetCellSize(2, 2, 3, 3)#改动第2,2,让它占3行3列类似于rows,cols的作用
grid.SetColSize(0, 125)#改动第一列
grid.SetRowSize(0, 100)#改动第一行
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

改变单元格的样式和样色,examples:

import wx
import wx.grid

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="GridAttributes",size=(600,300))
grid = wx.grid.Grid(self)
grid.CreateGrid(10,6)
for row in range(10):
for col in range(6):
grid.SetCellValue(row,col,"(%s,%s)" % (row,col))
#改变cell (1,1)
grid.SetCellTextColour(1, 1, "red")
grid.SetCellFont(1,1, wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
#改变cell (2,2)
grid.SetCellBackgroundColour(2, 2, "light blue")
#定义属性
attr = wx.grid.GridCellAttr()
attr.SetTextColour("navyblue")
attr.SetBackgroundColour("pink")
attr.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
#改变cell (4,0)(5,1),row 8
grid.SetAttr(4, 0, attr)
grid.SetAttr(5, 1, attr)
grid.SetRowAttr(8, attr)

app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

自定义描绘器(略)

捕获用户事件,创建自定义编辑器,examples:

import wx
import wx.grid
import string

class UpCaseCellEditor(wx.grid.PyGridCellEditor):#声明编辑器
def __init__(self):
wx.grid.PyGridCellEditor.__init__(self)

def Create(self, parent, id, evtHandler):#创建
"""
Called to create the control, which must derive from wx.Control.
*Must Override*
"""
self._tc = wx.TextCtrl(parent, id, "")
self._tc.SetInsertionPoint(0)
self.SetControl(self._tc)
if evtHandler:
self._tc.PushEventHandler(evtHandler)
self._tc.Bind(wx.EVT_CHAR, self.OnChar)
def SetSize(self, rect):
"""
Called to position/size the edit control within the cell rectangle.
If you don't fill the cell (the rect) then be sure to override
PaintBackground and do something meaningful there.
"""
self._tc.SetDimensions(rect.x,rect.y,rect.width+2,rect.height+2,wx.SIZE_ALLOW_MINUS_ONE)

def BeginEdit(self, row, col, grid):
"""
Fetch the value from the table and prepare the edit control
to begin editing. Set the focus to the edit control.
*Must Override*
"""
self.startValue = grid.GetTable().GetValue(row, col)
self._tc.SetValue(self.startValue)
self._tc.SetInsertionPointEnd()
self._tc.SetFocus()
self._tc.SetSelection(0, self._tc.GetLastPosition())

def EndEdit(self, row, col, grid):
"""
Complete the editing of the current cell. Returns True if the value
has changed. If necessary, the control may be destroyed.
*Must Override*
"""
changed = False
val = self._tc.GetValue()
if val != self.startValue:
changed = True
grid.GetTable().SetValue(row, col, val) # update the table
self.startValue = ''
self._tc.SetValue('')
return changed

def Reset(self):
"""
Reset the value in the control back to its starting value.
*Must Override*
"""
self._tc.SetValue(self.startValue)
self._tc.SetInsertionPointEnd()

def Clone(self):
"""
Create a new object which is the copy of this one
*Must Override*
"""
return UpCaseCellEditor()

def StartingKey(self, evt):
"""
If the editor is enabled by pressing keys on the grid, this will be
called to let the editor do something about that first key if desired.
"""
self.OnChar(evt)
if evt.GetSkipped():
self._tc.EmulateKeyPress(evt)

def OnChar(self, evt):
key = evt.GetKeyCode()
if key >= 255:
evt.Skip()
return
char = chr(key)
if char in string.letters:
char = char.upper()
self._tc.WriteText(char)#转换为大写
else:
evt.Skip()

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="Grid Editor",size=(640,480))
grid = wx.grid.Grid(self)
grid.CreateGrid(10,5)
grid.SetDefaultEditor(UpCaseCellEditor())#设置成默认编辑器
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()

第十五章 树形控件

树形菜单
wx.TreeCtrl的构造函数:
wx.TreeControl(parent, id=-1, pos=wx.DefaultPosition,size=wx.DefaultSize, style=wx.TR_HAS_BUTTONS,
validator=wx.DefaultValidator, name="treeCtrl")

简单的测试示例,最先报错如下:
ImportError: No module named data
是由于没有data.py文件造成的,data.py太长,我省略了一些:

tree = [
"wx.AcceleratorTable",
"wx.BrushList",
"wx.BusyInfo",
"wx.Clipboard",
"wx.Colour",
"wx.ColourData",
"wx.ColourDatabase",
"wx.ContextHelp",
["wx.DC", [
"wx.ClientDC",
["wx.MemoryDC", [
"wx.lib.colourchooser.canvas.BitmapBuffer",
["wx.BufferedDC", [
"wx.BufferedPaintDC", ]]]],
"wx.MetaFileDC",
"wx.MirrorDC",
"wx.PaintDC",
"wx.PostScriptDC",
"wx.PrinterDC",
"wx.ScreenDC",
"wx.WindowDC",]],
"wx.DragImage"
]

树形控件示例,examples:

import wx
import data

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="SimpleTree",size=(400,500))
# Create the tree
self.tree = wx.TreeCtrl(self)
# Add a root node
root = self.tree.AddRoot("wx.Object")
# Add nodes from our data set
self.AddTreeNodes(root, data.tree)
# Bind some interesting events
self.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, self.tree)
self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, self.tree)
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, self.tree)
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivated, self.tree)
# Expand the first level
self.tree.Expand(root)
def AddTreeNodes(self, parentItem, items):
"""
Recursively traverses the data structure, adding tree nodes to
match it.
"""
for item in items:
if type(item) == str:
self.tree.AppendItem(parentItem, item)
else:
newItem = self.tree.AppendItem(parentItem, item[0])
self.AddTreeNodes(newItem, item[1])

def GetItemText(self, item):
if item:
return self.tree.GetItemText(item)
else:
return ""

def OnItemExpanded(self, evt):
print "OnItemExpanded: ", self.GetItemText(evt.GetItem())

def OnItemCollapsed(self, evt):
print "OnItemCollapsed:", self.GetItemText(evt.GetItem())
def OnSelChanged(self, evt):
print "OnSelChanged: ", self.GetItemText(evt.GetItem())
def OnActivated(self, evt):
print "OnActivated: ", self.GetItemText(evt.GetItem())
app = wx.PySimpleApp(redirect=True)
frame = TestFrame()
frame.Show()
app.MainLoop()

带图标的树形控件,examples:

import wx
import data
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="TreeWithIcons",size=(400,500))
# 创建一个图像列表
il = wx.ImageList(16,16)
# 添加图像到列表
self.fldridx = il.Add(
wx.ArtProvider.GetBitmap(wx.ART_FOLDER,
wx.ART_OTHER, (16,16)))
self.fldropenidx = il.Add(
wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN,
wx.ART_OTHER, (16,16)))
self.fileidx = il.Add(
wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE,
wx.ART_OTHER, (16,16)))
# 创建树
self.tree = wx.TreeCtrl(self)
# 给树分配图像列表
self.tree.AssignImageList(il)
root = self.tree.AddRoot("wx.Object")
self.tree.SetItemImage(root, self.fldridx,wx.TreeItemIcon_Normal)
# 设置根的图像
self.tree.SetItemImage(root, self.fldropenidx,wx.TreeItemIcon_Expanded)
self.AddTreeNodes(root, data.tree)
self.tree.Expand(root)
def AddTreeNodes(self, parentItem, items):
for item in items:
if type(item) == str:
newItem = self.tree.AppendItem(parentItem, item)
self.tree.SetItemImage(newItem, self.fileidx,wx.TreeItemIcon_Normal)
# 设置数据图像
else:
newItem = self.tree.AppendItem(parentItem, item[0])
self.tree.SetItemImage(newItem, self.fldridx,wx.TreeItemIcon_Normal)
# 设置结点的图像
self.tree.SetItemImage(newItem, self.fldropenidx,wx.TreeItemIcon_Expanded)
self.AddTreeNodes(newItem, item[1])
def GetItemText(self, item):
if item:
return self.tree.GetItemText(item)
else:
return ""

app = wx.PySimpleApp(redirect=True)
frame = TestFrame()
frame.Show()
app.MainLoop()

TreeListCtrl能够显示与每行相关的数据的附加列,examples:

import wx
import wx.gizmos
import data
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title="TreeListCtrl",size=(400,500))
# Create an image list
il = wx.ImageList(16,16)
# Get some standard images from the art provider and add them
# to the image list
self.fldridx = il.Add(
wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, (16,16)))
self.fldropenidx = il.Add(
wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, (16,16)))
self.fileidx = il.Add(
wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16,16)))
# 创建树列表控件
self.tree = wx.gizmos.TreeListCtrl(self, style =
wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT)
# Give it the image list
self.tree.AssignImageList(il)
#创建一些列
self.tree.AddColumn("Class Name")
self.tree.AddColumn("Description")
self.tree.SetMainColumn(0) # the one with the tree in it...
self.tree.SetColumnWidth(0, 200)
self.tree.SetColumnWidth(1, 200)
# Add a root node and assign it some images
root = self.tree.AddRoot("wx.Object")
self.tree.SetItemText(root, "A description of wx.Object", 1)#给列添加文本
self.tree.SetItemImage(root,self.fldridx,wx.TreeItemIcon_Normal)
self.tree.SetItemImage(root,self.fldropenidx,wx.TreeItemIcon_Expanded)
# Add nodes from our data set
self.AddTreeNodes(root, data.tree)
# Bind some interesting events
self.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, self.tree)
self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, self.tree)
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, self.tree)
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivated, self.tree)
# Expand the first level
self.tree.Expand(root)
def AddTreeNodes(self, parentItem, items):
"""
Recursively traverses the data structure, adding tree nodes to
match it.
"""
for item in items:
if type(item) == str:
newItem = self.tree.AppendItem(parentItem, item)
self.tree.SetItemText(newItem,"A description of %s" % item,1)
#给列添加文本
self.tree.SetItemImage(newItem,self.fileidx,wx.TreeItemIcon_Normal)
else:
newItem = self.tree.AppendItem(parentItem, item[0])
self.tree.SetItemText(newItem,"A description of %s" % item[0],1)
self.tree.SetItemImage(newItem, self.fldridx,wx.TreeItemIcon_Normal)
self.tree.SetItemImage(newItem, self.fldropenidx,wx.TreeItemIcon_Expanded)
self.AddTreeNodes(newItem, item[1])
def GetItemText(self, item):
if item:
return self.tree.GetItemText(item)
else:
return ""
def OnItemExpanded(self, evt):
print "OnItemExpanded: ", self.GetItemText(evt.GetItem())
def OnItemCollapsed(self, evt):
print "OnItemCollapsed:", self.GetItemText(evt.GetItem())
def OnSelChanged(self, evt):
print "OnSelChanged: ", self.GetItemText(evt.GetItem())
def OnActivated(self, evt):
print "OnActivated: ", self.GetItemText(evt.GetItem())
app = wx.PySimpleApp(redirect=True)
frame = TestFrame()
frame.Show()
app.MainLoop()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要开始学习wxPython,首先你需要下载wxPython的安装文件,你可以在wxPython的官方网站上找到下载地址。接下来,你可以使用命令行工具通过以下命令下载和安装wxPython: ``` pip install -U -f https://wxpython.org/Phoenix/snapshot-builds/ wxPython ``` 这个命令会从指定的URL下载最新版本的wxPython,并将其安装到你的Python环境中。 一旦安装完成,你就可以开始学习基础知识了。你可以查阅wxPython的官方文档和教程,它们提供了很好的学习资源。你可以在wxPython的官方网站上找到官方文档,这个文档详细介绍了wxPython的各个方面。此外,还有一些比较好的进阶教程和书籍,比如《wxPython参考文档》、《The wxPython Cookbook》和《Python GUI编程实战》等[3]。这些教程将帮助你了解一些高级概念,如自定义控件、绘图、数据绑定、多线程和网络编程等。 希望这些资源能够帮助你入门wxPython,祝你学习顺利!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [wxPython入门](https://blog.csdn.net/weixin_42515225/article/details/113550696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【Python wxPython】零基础也能轻松掌握的学习路线与参考资料](https://blog.csdn.net/weixin_50409347/article/details/130982779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值