wxPython:如何从wx.StaticText获取sizer?
这个小部件是我制作的许多大小部件中的一个,但是如何获取其中一个小部件的大小部件,例如在wxPython:如何从wx.StaticText获取sizer?,wxpython,sizer,Wxpython,Sizer,这个小部件是我制作的许多大小部件中的一个,但是如何获取其中一个小部件的大小部件,例如在wx.StaticText中。首先,我认为wx.StaticText有一个方法GetSizer(),因为它派生自wx.Window,但它总是返回None,有办法吗 对不起,我的语言不好 编辑(2012年8月23日)Mike Driscoll提供的解决方案: 使用self.sizer.GetChildren()从某个大小器中获取SizerItemList,然后使用GetWindow()从列表中获取实际的小部件如果
wx.StaticText
中。首先,我认为wx.StaticText有一个方法GetSizer()
,因为它派生自wx.Window
,但它总是返回None
,有办法吗
对不起,我的语言不好
编辑(2012年8月23日)Mike Driscoll提供的解决方案:
使用
self.sizer.GetChildren()
从某个大小器中获取SizerItemList
,然后使用GetWindow()
从列表中获取实际的小部件如果大小器有子部件,则GetChildren确实返回小部件列表。我已经用WxPython2.8做过很多次了。我不记得有人提到它在2.9或凤凰城是不同的,所以我猜它不是。您能告诉我们您使用的是哪个操作系统和wxPython版本吗
如果您想知道如何获取任意大小的文件,可以尝试GetContainingSizer或使用
编辑(08/22/2012):下面是一个工作示例:
import wx
########################################################################
class MyApp(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Example")
panel = wx.Panel(self)
lbl = wx.StaticText(panel, label="I'm a label!")
txt = wx.TextCtrl(panel, value="blah blah")
btn = wx.Button(panel, label="Clear")
btn.Bind(wx.EVT_BUTTON, self.onClear)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(lbl, 0, wx.ALL, 5)
self.sizer.Add(txt, 0, wx.ALL, 5)
self.sizer.Add(btn, 0, wx.ALL, 5)
panel.SetSizer(self.sizer)
#----------------------------------------------------------------------
def onClear(self, event):
""""""
children = self.sizer.GetChildren()
for child in children:
widget = child.GetWindow()
print widget
if isinstance(widget, wx.TextCtrl):
widget.Clear()
if __name__ == "__main__":
app = wx.App(False)
frame = MyApp()
frame.Show()
app.MainLoop()
你能详细描述一下你想做什么吗?仅当您以前调用
SetSizer()
时,才会返回一个sizer。通常,您只在wx.Frame
或wx.Panel
@acattle上调用SetSizer()
:实际上,我试图从sizer内的小部件获取所有值,也许我可以从sizer使用GetChildren()
,但它只返回SizerItemList而不是实际的小部件列表,所以我想我可以使用GetSizer()
在所有窗口小部件中返回sizer,当然它不返回任何内容。抱歉,我没有说清楚。当然,sizer有子项,我用add()
添加它们,例如我有两个小部件wx.StaticText
和wx.TextCtrl
,如果我想清除wx.TextCtrl
,我可以这样做吗sizer.GetChildren()[1].Clear()
,但刚刚发生错误AttributeError:“SizerItem”对象没有属性“Clear”
,可能我不明白GetChildren()
是如何工作的。我将Windows XP与wxPython 2.8-Unicode一起使用,我只使用self.myTextCtrl.SetValue(“”)或self.myTextCtrl.Clear()。在我看来,施胶器的工作方式似乎不同,而且是愚蠢的。跟踪sizer中的内容的一种方法是,将项目添加到列表中,同时将其添加到sizer并以这种方式访问。它不漂亮,但很管用。谢谢!我就像你说的那样,我把所有的小部件都放在orderedict()
中,这样我就可以访问它们了,但仍然让我感到困惑,为什么面板的GetChildren()
返回实际的小部件而不是sizer?无论如何,谢谢你的帮助。好吧,我理解这个面板,因为它是“孩子”的“家长”,但我不明白为什么施胶器不能吐出它的内容。我会在wxPython邮件列表上询问。