【问题标题】:wxPython: Check if tree node has focus (TreeCtrl)wxPython:检查树节点是否有焦点(TreeCtrl)
【发布时间】:2024-04-24 03:50:02
【问题描述】:

不要被代码吓倒。这真的很简单。 (如果你想运行它)

我正在尝试找出一种在树节点具有焦点时做某事的方法。我知道如果 TreeCtrl 有焦点,我是否想做某事,那么它将是:

self.tree.Bind(wx.EVT_SET_FOCUS, some_function)

但我不想要那个,我想要它作为树节点。有什么帮助吗?

对于我的应用程序,每个选定的树节点都会显示一个弹出窗口,如果树节点失去焦点,它就会消失。

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(600, 400))
        self.splitter = wx.SplitterWindow(self, -1)
        self.leftPanel = wx.Panel(self.splitter, -1)
        self.tree = MyTree(self.leftPanel, 1, wx.DefaultPosition, (300, 300))
        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1)

        self.rightPanel = wx.Panel(self.splitter, -1)

        self.splitter.SplitVertically(self.leftPanel, self.rightPanel)

        sizer = wx.BoxSizer ( )
        sizer.Add ( self.splitter, 1, wx.EXPAND )
        self.SetSizer ( sizer )

        self.tree.SetFocus()

    def OnSelChanged(self, event):
        print 'Sel Changed'


class MyTree(wx.TreeCtrl):
    def __init__(self, panel, id, pos, size):
        self.panel = panel
        wx.TreeCtrl.__init__(self, panel, id, pos=pos, size=size, style=wx.TR_HAS_BUTTONS)

        wx.EVT_TREE_ITEM_EXPANDING(self,-1,self.OnItemExpanding)
        wx.EVT_TREE_ITEM_COLLAPSED(self,-1,self.OnItemCollapsed)
        wx.EVT_SET_FOCUS(self,self.OnGotFocus)

        self.root = self.AddRoot('Root')
        self.SetPyData(self.root,0)
        self.SetItemHasChildren(self.root)
        self.Expand(self.root)
        self.SetImageList(wx.ImageList(16,16))

    def OnItemExpanding(self,evt):
        node = evt.GetItem()
        data = self.GetPyData(node)
        if data:
            for i in range(1,2):
                leaf = self.AppendItem(node,'%s.%s' % (data,i))
                self.SetPyData(leaf,'%s.%s' % (data,i))
        else:
            for i in range(1,2):
                leaf = self.AppendItem(node,'%s' % (i))
                self.SetPyData(leaf,'%s' % (i))
                self.SetItemHasChildren(leaf)

    def OnItemCollapsed(self,evt):
        self.DeleteChildren(evt.GetItem())

    def OnGotFocus(self,evt):
        print 'tree got focus'
        evt.Skip()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, "This is a test")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp(0)
app.MainLoop()

【问题讨论】:

    标签: python events tree focus wxpython


    【解决方案1】:

    我相信你想要

    ...
        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED,self.OnTreeSelectionChange)
        self.tree.Bind(wx.EVT_KILL_FOCUS,self.OnKillTreeFocus)
    
    ...
    def OnTreeSelectionChange(self, evt):
        print "OnSelChanged:   ", self.GetItemText(evt.GetItem())
    

    【讨论】:

    • 我以前试过这个,它只在前几次有效,然后停止工作(弹出窗口不再消失)。我会再试一次,如果成功我会接受你的回答
    • 显然我需要强制弹出窗口消失,然后再创建另一个。
    • 右对齐是什么意思?你可以给它一个弹出的位置...
    • 嗯,位置原点从左上角开始,但我想让它从右边开始
    • 我得到了显示尺寸(wx.DisplaySize)并减去了弹出窗口的尺寸