我正在尝试在 wxPython 中创建一个帮助菜单,左侧有一个树控件,右侧有一个 html 查看器;树控件充当一种导航菜单,单击树控件中的项目时,应在左侧面板中加载适当的本地 .html 文件。
但是,当我尝试实现这一点时,我无法将任何事件绑定到树控件中的不同节点。这就是我到目前为止所拥有的 - 有人可以告诉我我哪里出错了吗?
代码:
import wx
import wx.html
class HelpMenu(wx.Frame):
def __init__(self, parent):
tstr = "Need help?"
super(HelpMenu, self).__init__(
parent, -1, title=tstr, size=wx.Size(800, 500), style=wx.CAPTION |
wx.CLOSE_BOX | wx.SYSTEM_MENU | wx.RESIZE_BORDER)
splitter = wx.SplitterWindow(self)
window1 = NavBar(splitter)
window2 = htmlPanel(splitter)
splitter.SplitVertically(window1, window2)
splitter.SetSashGravity(0.5)
# splitter.SetMinimumPaneSize(20)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(splitter, 1, wx.EXPAND)
self.SetSizer(sizer)
class htmlPanel(wx.Panel):
def __init__(self, parent):
super(htmlPanel, self).__init__(parent)
html = wx.html.HtmlWindow(self)
if 'gtk2' in wx.PlatformInfo:
html.SetStandardFonts()
# htmlszr = wx.BoxSizer(wx.VERTICAL)
# htmlszr.Add(html, 0, wx.EXPAND)
html.LoadPage('.\\index.html')
# self.SetSizer(htmlszr)
class NavTree(wx.TreeCtrl):
def __init__(self, parent, id, pos, size, style):
super(NavTree, self).__init__(parent, id, pos, size, style)
class NavBar(wx.Panel):
def __init__(self, parent):
super(NavBar, self).__init__(parent)
self.tree = NavTree(
self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TR_HAS_BUTTONS)
self.root = self.tree.AddRoot('Help Contents')
self.welcome = self.tree.AppendItem(self.root, 'Start Page')
self.background = self.tree.AppendItem(self.root, 'Background')
self.method = self.tree.AppendItem(self.root, 'Calculation Method')
self.using = self.tree.AppendItem(self.root, 'Using the Calculator')
self.start = self.tree.AppendItem(self.using, 'Selecting Data Type')
self.params = self.tree.AppendItem(self.using, 'Setting Parameters')
self.results = self.tree.AppendItem(self.using, 'Viewing Results')
self.interp = self.tree.AppendItem(self.root, 'Interpreting Results')
# insert more children of interp here for various issues concerning
# interpretation
self.welcome.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._welcome)
self.background.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._background)
self.method.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._method)
self.using.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._using)
self.start.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._start)
self.params.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._params)
self.results.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._results)
self.interp.Bind(wx.EVT_TREE_ITEM_ACTIVATE, self._interp)
self.treeszr = wx.BoxSizer(wx.VERTICAL)
self.treeszr.Add(self.tree, 0, wx.EXPAND)
self.SetSizer(self.treeszr)
def _welcome(self, event):
htmlPanel.html.LoadPage('.\\Help\\index.html')
def _background(self, event):
htmlPanel.html.LoadPage('.\\Help\\background.html')
def _method(self, event):
htmlPanel.html.LoadPage('.\\Help\\method.html')
def _using(self, event):
htmlPanel.html.LoadPage('.\\Help\\use.html')
def _start(self, event):
htmlPanel.html.LoadPage('.\\Help\\start.html')
def _params(self, event):
htmlPanel.html.LoadPage('\\Help\\params.html')
def _results(self, event):
htmlPanel.html.LoadPage('\\Help\\results.html')
def _interp(self, event):
htmlPanel.html.LoadPage('\\Help\\interpretation.html')
if __name__ == "__main__":
app = wx.App(False)
frame = HelpMenu(None)
frame.Show()
app.MainLoop()
输出:
>>> Traceback (most recent call last):
File "c:\Python\testing\splitterwindow.py", line 100, in <module>
frame = HelpMenu(None)
File "c:\Python\testing\splitterwindow.py", line 13, in
__init__
window1 = NavBar(splitter)
File "c:\Python\testing\splitterwindow.py", line 60, in __init__
self.welcome.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self._welcome)
AttributeError: 'TreeItemId' object has no attribute 'Bind'
>>> C:\Python\testing>
我有一个偷偷摸摸的怀疑self.welcome
不是指节点本身,而是指其他东西,这就是错误的根源。我只是不太确定如何引用树控件中的实际节点/文本以便能够将事件处理程序绑定到它。