Python 滚动面板中包含wx.Panel的子级上的SetFocus()不';不要把它带到视野中
下面是示例代码,包括我的问题的解决方法。 我将包含自己控件的自己的面板作为子面板添加到ScrolledPanelPython 滚动面板中包含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
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: