📄 customtreectrl.py
字号:
self.Destroy()
event.Skip()
def OnCancel(self, event):
self.Destroy()
event.Skip()
def GetBitmap(self, input, which):
if input == 0:
bmp = wx.EmptyBitmap(16,16)
self.ClearBmp(bmp)
elif input > 36:
bmp = images.getSmilesBitmap()
else:
bmp = wx.ArtProvider_GetBitmap(eval(ArtIDs[input]), wx.ART_OTHER, (16,16))
if not bmp.Ok():
bmp = wx.EmptyBitmap(16,16)
self.ClearBmp(bmp)
self.bitmaps[which].SetBitmap(bmp)
self.bitmaps[which].Refresh()
def GetBitmaps(self, bitmaps):
output = []
for count, input in enumerate(bitmaps):
if input < 0:
bmp = wx.EmptyBitmap(16,16)
self.ClearBmp(bmp)
elif input > 35:
bmp = images.getSmilesBitmap()
else:
bmp = wx.ArtProvider_GetBitmap(eval(ArtIDs[input+1]), wx.ART_OTHER, (16,16))
if not bmp.Ok():
bmp = wx.EmptyBitmap(16,16)
self.ClearBmp(bmp)
self.bitmaps[count].SetBitmap(bmp)
def ClearBmp(self, bmp):
dc = wx.MemoryDC()
dc.SelectObject(bmp)
dc.SetBackground(wx.Brush("white"))
dc.Clear()
#---------------------------------------------------------------------------
# CustomTreeCtrl Demo Implementation
#---------------------------------------------------------------------------
class CustomTreeCtrlDemo(wx.Panel):
def __init__(self, parent, log):
wx.Panel.__init__(self, parent)
self.log = log
self.oldicons = 0
splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D)
# Create the CustomTreeCtrl, using a derived class defined below
self.tree = CustomTreeCtrl(splitter, -1, log=self.log,
style= wx.SUNKEN_BORDER| CT.TR_HAS_BUTTONS | CT.TR_HAS_VARIABLE_ROW_HEIGHT)
self.leftpanel = wx.ScrolledWindow(splitter, -1, style=wx.SUNKEN_BORDER)
self.leftpanel.SetScrollRate(20,20)
width = self.PopulateLeftPanel(self.tree.styles, self.tree.events)
# add the windows to the splitter and split it.
splitter.SplitVertically(self.leftpanel, self.tree, 300)
splitter.SetMinimumPaneSize(width+5)
sizer = wx.BoxSizer()
sizer.Add(splitter, 1, wx.EXPAND)
self.SetSizer(sizer)
def PopulateLeftPanel(self, styles, events):
pnl = wx.Panel(self.leftpanel)
mainsizer = wx.BoxSizer(wx.VERTICAL)
recreatetree = wx.Button(pnl, -1, "Recreate CustomTreeCtrl")
mainsizer.Add(recreatetree, 0, wx.ALL|wx.ALIGN_CENTER, 10)
recreatetree.Bind(wx.EVT_BUTTON, self.OnRecreateTree)
staticboxstyles = wx.StaticBox(pnl, -1, "CustomTreeCtrl Styles")
stylesizer = wx.StaticBoxSizer(staticboxstyles, wx.VERTICAL)
staticboxevents = wx.StaticBox(pnl, -1, "CustomTreeCtrl Events")
eventssizer = wx.StaticBoxSizer(staticboxevents, wx.VERTICAL)
staticboxcolours = wx.StaticBox(pnl, -1, "CustomTreeCtrl Images/Colours")
colourssizer = wx.StaticBoxSizer(staticboxcolours, wx.VERTICAL)
staticboxthemes = wx.StaticBox(pnl, -1, "CustomTreeCtrl Themes/Gradients")
themessizer = wx.StaticBoxSizer(staticboxthemes, wx.VERTICAL)
self.treestyles = []
self.treeevents = []
for count, style in enumerate(styles):
if count == 0:
tags = wx.ALL
else:
tags = wx.LEFT|wx.RIGHT|wx.BOTTOM
if style != "TR_DEFAULT_STYLE":
check = wx.CheckBox(pnl, -1, style)
stylesizer.Add(check, 0, tags, 3)
if style in ["TR_HAS_BUTTONS", "TR_HAS_VARIABLE_ROW_HEIGHT"]:
check.SetValue(1)
if style == "TR_HAS_VARIABLE_ROW_HEIGHT":
check.Enable(False)
check.Bind(wx.EVT_CHECKBOX, self.OnCheckStyle)
self.treestyles.append(check)
for count, event in enumerate(events):
if count == 0:
tags = wx.ALL
else:
tags = wx.LEFT|wx.RIGHT|wx.BOTTOM
if count not in [6, 17, 22, 23]:
check = wx.CheckBox(pnl, -1, event)
eventssizer.Add(check, 0, tags, 3)
if event in ["EVT_TREE_ITEM_EXPANDED", "EVT_TREE_ITEM_COLLAPSED",
"EVT_TREE_SEL_CHANGED", "EVT_TREE_SEL_CHANGING"]:
check.SetValue(1)
check.Bind(wx.EVT_CHECKBOX, self.OnCheckEvent)
self.treeevents.append(check)
sizer1 = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(pnl, -1, "Connection Pen")
font = label.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
label.SetFont(font)
buttonconnection = wx.Button(pnl, -1, "Choose...")
buttonconnection.Bind(wx.EVT_BUTTON, self.OnButtonConnection)
sizer1.Add(label, 0, wx.ALL|wx.ALIGN_CENTER, 5)
sizer1.Add((1,0), 1, wx.EXPAND)
sizer1.Add(buttonconnection, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
sizer2 = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(pnl, -1, "Border Pen")
font = label.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
label.SetFont(font)
buttonborder = wx.Button(pnl, -1, "Choose...")
buttonborder.Bind(wx.EVT_BUTTON, self.OnButtonBorder)
sizer2.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
sizer2.Add((1,0), 1, wx.EXPAND)
sizer2.Add(buttonborder, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
sizer3 = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(pnl, -1, "Tree Buttons")
font = label.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
label.SetFont(font)
buttontree = wx.Button(pnl, -1, "Choose...")
buttontree.Bind(wx.EVT_BUTTON, self.OnButtonTree)
sizer3.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
sizer3.Add((1,0), 1, wx.EXPAND)
sizer3.Add(buttontree, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
sizer4 = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(pnl, -1, "Check/Radio Buttons")
font = label.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
label.SetFont(font)
buttoncr = wx.Button(pnl, -1, "Choose...")
buttoncr.Bind(wx.EVT_BUTTON, self.OnButtonCheckRadio)
sizer4.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
sizer4.Add((1,0), 1, wx.EXPAND)
sizer4.Add(buttoncr, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
sizer5 = wx.BoxSizer(wx.HORIZONTAL)
radioimage = wx.RadioButton(pnl, -1, "Image Background", style=wx.RB_GROUP)
radioimage.Bind(wx.EVT_RADIOBUTTON, self.OnBackgroundImage)
self.imagebutton = wx.Button(pnl, -1, "Choose...")
self.imagebutton.Bind(wx.EVT_BUTTON, self.OnChooseImage)
sizer5.Add(radioimage, 0, wx.ALL|wx.ALIGN_CENTER, 5)
sizer5.Add((1,0), 1, wx.EXPAND)
sizer5.Add(self.imagebutton, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
sizer6 = wx.BoxSizer(wx.HORIZONTAL)
radiobackground = wx.RadioButton(pnl, -1, "Background Colour")
radiobackground.Bind(wx.EVT_RADIOBUTTON, self.OnBackgroundColour)
self.backbutton = csel.ColourSelect(pnl, -1, "Choose...", wx.WHITE)
self.backbutton.Bind(csel.EVT_COLOURSELECT, self.OnChooseBackground)
sizer6.Add(radiobackground, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
sizer6.Add((1,0), 1, wx.EXPAND)
sizer6.Add(self.backbutton, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
colourssizer.Add(sizer1, 0, wx.EXPAND)
colourssizer.Add(sizer2, 0, wx.EXPAND)
colourssizer.Add(sizer3, 0, wx.EXPAND)
colourssizer.Add(sizer4, 0, wx.EXPAND)
colourssizer.Add(sizer5, 0, wx.EXPAND)
colourssizer.Add(sizer6, 0, wx.EXPAND)
sizera = wx.BoxSizer(wx.HORIZONTAL)
self.checknormal = wx.CheckBox(pnl, -1, "Standard Colours")
self.focus = csel.ColourSelect(pnl, -1, "Focus",
self.tree.GetHilightFocusColour())
self.unfocus = csel.ColourSelect(pnl, -1, "Non-Focus",
self.tree.GetHilightNonFocusColour())
self.checknormal.Bind(wx.EVT_CHECKBOX, self.OnCheckNormal)
self.focus.Bind(csel.EVT_COLOURSELECT, self.OnFocusColour)
self.unfocus.Bind(csel.EVT_COLOURSELECT, self.OnNonFocusColour)
sizera1 = wx.BoxSizer(wx.VERTICAL)
sizera1.Add(self.focus, 0, wx.BOTTOM, 2)
sizera1.Add(self.unfocus, 0)
sizera.Add(self.checknormal, 0, wx.ALL, 3)
sizera.Add((1, 0), 1, wx.EXPAND)
sizera.Add(sizera1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND, 3)
sizerb = wx.BoxSizer(wx.VERTICAL)
self.checkgradient = wx.CheckBox(pnl, -1, "Gradient Theme")
self.checkgradient.Bind(wx.EVT_CHECKBOX, self.OnCheckGradient)
sizerb1 = wx.BoxSizer(wx.HORIZONTAL)
sizerb1.Add((10, 0))
self.radiohorizontal = wx.RadioButton(pnl, -1, "Horizontal", style=wx.RB_GROUP)
self.radiohorizontal.Bind(wx.EVT_RADIOBUTTON, self.OnHorizontal)
sizerb1.Add(self.radiohorizontal, 0, wx.TOP|wx.BOTTOM, 3)
sizerb2 = wx.BoxSizer(wx.HORIZONTAL)
sizerb2.Add((10, 0))
self.radiovertical = wx.RadioButton(pnl, -1, "Vertical")
self.radiovertical.Bind(wx.EVT_RADIOBUTTON, self.OnVertical)
sizerb2.Add(self.radiovertical, 0, wx.BOTTOM, 3)
sizerb3 = wx.BoxSizer(wx.HORIZONTAL)
self.firstcolour = csel.ColourSelect(pnl, -1, "First Colour",
self.tree.GetFirstGradientColour())
self.secondcolour = csel.ColourSelect(pnl, -1, "Second Colour",
self.tree.GetSecondGradientColour())
self.firstcolour.Bind(csel.EVT_COLOURSELECT, self.OnFirstColour)
self.secondcolour.Bind(csel.EVT_COLOURSELECT, self.OnSecondColour)
sizerb3.Add(self.firstcolour, 0, wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 3)
sizerb3.Add(self.secondcolour, 0, wx.LEFT|wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 3)
sizerb.Add(self.checkgradient, 0, wx.ALL, 3)
sizerb.Add(sizerb1, 0)
sizerb.Add(sizerb2, 0)
sizerb.Add(sizerb3, 0, wx.ALIGN_CENTER)
self.checkvista = wx.CheckBox(pnl, -1, "Windows Vista Theme")
self.checkvista.Bind(wx.EVT_CHECKBOX, self.OnVista)
themessizer.Add(sizera, 0, wx.EXPAND)
themessizer.Add(sizerb, 0, wx.EXPAND)
themessizer.Add((0, 5))
themessizer.Add(self.checkvista, 0, wx.EXPAND|wx.ALL, 3)
mainsizer.Add(stylesizer, 0, wx.EXPAND|wx.ALL, 5)
mainsizer.Add(colourssizer, 0, wx.EXPAND|wx.ALL, 5)
mainsizer.Add(themessizer, 0, wx.EXPAND|wx.ALL, 5)
mainsizer.Add(eventssizer, 0, wx.EXPAND|wx.ALL, 5)
pnl.SetSizer(mainsizer)
pnl.Fit()
swsizer = wx.BoxSizer(wx.VERTICAL)
swsizer.Add(pnl, 0, wx.EXPAND)
self.leftpanel.SetSizer(swsizer)
swsizer.Layout()
radiobackground.SetValue(1)
self.checknormal.SetValue(1)
self.radiohorizontal.Enable(False)
self.radiovertical.Enable(False)
self.firstcolour.Enable(False)
self.secondcolour.Enable(False)
self.imagebutton.Enable(False)
return mainsizer.CalcMin().width + wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X)
def OnRecreateTree(self, event):
splitter = self.tree.GetParent()
newtree = CustomTreeCtrl(splitter, -1, log=self.log)
splitter.ReplaceWindow(self.tree, newtree)
self.tree.Destroy()
self.tree = newtree
# Todo: The settings in the leftpanel should be reset too
def OnCheckStyle(self, event):
self.tree.ChangeStyle(self.treestyles)
event.Skip()
def OnCheckEvent(self, event):
obj = event.GetEventObject()
self.tree.BindEvents(obj)
event.Skip()
def OnButtonConnection(self, event):
pen = self.tree.GetConnectionPen()
dlg = PenDialog(self, -1, oldpen=pen, pentype=0)
dlg.ShowModal()
event.Skip()
def SetConnectionPen(self, pen):
self.tree.SetConnectionPen(pen)
def OnButtonBorder(self, event):
pen = self.tree.GetBorderPen()
dlg = PenDialog(self, -1, oldpen=pen, pentype=1)
dlg.ShowModal()
event.Skip()
def SetBorderPen(self, pen):
self.tree.SetBorderPen(pen)
def OnButtonTree(self, event):
dlg = TreeButtonsDialog(self, -1, oldicons=self.oldicons)
dlg.ShowModal()
event.Skip()
def OnButtonCheckRadio(self, event):
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -