Python 滚动面板中包含wx.Panel的子级上的SetFocus()不';不要把它带到视野中

Python 滚动面板中包含wx.Panel的子级上的SetFocus()不';不要把它带到视野中,python,wxpython,Python,Wxpython,下面是示例代码,包括我的问题的解决方法。 我将包含自己控件的自己的面板作为子面板添加到ScrolledPanel wx.Frame |-wx.ScrolledPanel |-wx.Panel |-wx.Choice wx.TextCtrl |-wx.Panel |-wx.Choice wx.TextCtrl |-wx.Panel |-... 将焦点设置为Scrolled Panel中的最后一个子项时,我希望将其显示出来。但是,如果我的孩子将面板作为Scrolled

下面是示例代码,包括我的问题的解决方法。 我将包含自己控件的自己的面板作为子面板添加到ScrolledPanel

wx.Frame
|-wx.ScrolledPanel
  |-wx.Panel
   |-wx.Choice wx.TextCtrl
  |-wx.Panel
   |-wx.Choice wx.TextCtrl
  |-wx.Panel
   |-...
将焦点设置为Scrolled Panel中的最后一个子项时,我希望将其显示出来。但是,如果我的孩子将面板作为ScrolledPanel的孩子包含,那么调用SetFocus()不会自动工作。在这种情况下,永远不会调用ScrolledPanel.OnChildFocus()。因此,我必须调用ScrolledPanel.ScrollChildIntoView()作为解决方法

当使用none panel子级(可能是wx.Button)时,在对子级调用SetFocus()时,这会自动与ScrolledPanel一起工作

如果没有解决办法,这怎么可能解决?也许它背后有一个(设计)缺陷,我应该报告

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import wx
import wx.lib.scrolledpanel


class MyPanel(wx.Panel):
    def __init__(self, parent):
        super(wx.Panel, self).__init__(parent)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(wx.Choice(self, choices=['a', 'b']))
        sizer.Add(wx.TextCtrl(self, value=str(id(self))))
        self.SetSizer(sizer)


class MyFrame(wx.Frame):
    def __init__(self):
        super(wx.Frame, self).__init__(None)
        sizer = wx.BoxSizer(wx.VERTICAL)

        bt = wx.Button(self, label='Test Add')
        bt.Bind(wx.EVT_BUTTON, self._OnAdd)
        sizer.Add(bt)

        self.panel = wx.lib.scrolledpanel.ScrolledPanel(self, style=wx.TAB_TRAVERSAL)
        self.panelsizer = wx.BoxSizer(wx.VERTICAL)

        i = 0
        while i < 20:
            self.panelsizer.Add(MyPanel(self.panel))
            i += 1

        self.panel.SetSizer(self.panelsizer)
        self.panel.SetupScrolling()

        sizer.Add(self.panel, proportion=1, flag=wx.EXPAND)
        self.SetSizer(sizer)

    def _OnAdd(self, event):
        focus = MyPanel(self.panel)
        self.panelsizer.Add(focus)

        self.Layout()
        # this alone doesn't work
        focus.SetFocus()
        # this is the workaround
        self.panel.ScrollChildIntoView(focus)


if __name__ == '__main__':
    app = wx.App()
    win = MyFrame()
    win.Show()
    app.MainLoop()
#/usr/bin/env蟒蛇3
#-*-编码:utf-8-*-
导入wx
导入wx.lib.scrolled面板
类别MyPanel(wx.Panel):
定义初始化(自身,父级):
超级(wx.Panel,self)。\uuuuu初始化(父级)
sizer=wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(wx.Choice(self,choices=['a','b']))
sizer.Add(wx.TextCtrl(self,value=str(id(self)))
自整定器(施胶器)
类MyFrame(wx.Frame):
定义初始化(自):
超级(wx.Frame,self)。\uuuu init\uuuuu(无)
sizer=wx.BoxSizer(wx.VERTICAL)
bt=wx.按钮(self,label='Test Add')
bt.Bind(wx.EVT_按钮,自添加)
sizer.Add(bt)
self.panel=wx.lib.scrolledpanel.scrolledpanel(self,style=wx.TAB_遍历)
self.panelsizer=wx.BoxSizer(wx.VERTICAL)
i=0
而我<20:
self.panelsizer.Add(MyPanel(self.panel))
i+=1
self.panel.setizer(self.panelsizer)
self.panel.SetupScrolling()
sizer.Add(self.panel,比例=1,标志=wx.EXPAND)
自整定器(施胶器)
定义OnAdd(自身、事件):
焦点=MyPanel(self.panel)
self.panelsizer.Add(焦点)
self.Layout()
#单凭这一点是行不通的
focus.SetFocus()
#这是解决办法
self.panel.ScrollChildIntoView(焦点)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=wx.app()
win=MyFrame()
win.Show()
app.MainLoop()

SetFocus()单独在Windows上运行对我来说很好,谢谢您的测试。你能指定你的环境吗。Python版本,wxPython/wxPhoenix版本,windows版本?windows7,wx 3.0.2.0,Python 2.7.8Bug-Report: