我在这里重现了错误;
import wx
import debug
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
vbox = wx.BoxSizer(wx.VERTICAL)
toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
vbox.Add(toolbar, 0, border=5)
app = wx.App(0)
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
现在无论我在哪里添加此行来添加文本控件;
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
它出现在工具栏上。我阅读了文档并遵循了一些教程,但仍然无法完全掌握这个概念。我怎样才能实现我想要的?我希望文本控件显示在工具栏下方并适合剩余的空间。
答案 0 :(得分:1)
没有看到实际的问题代码,很难确定,但我打赌你想要这个:
vbox.Add(self.control)
或者,如果TextCtrl
内未构建__init__
,请设置self.vbox.Add
,当然会将vbox
中的__init__
引用更改为self.vbox
TextCtrl
。
引自the docs:
box sizer背后的基本思想是,窗口通常以相当简单的基本几何图形排列,通常是行或列或两者的嵌套层次结构。 wx.BoxSizer将在简单的行或列中布置其项目,具体取决于传递给构造函数的orientation参数。
这正是您想要的 - 您想要Toolbar
将BoxSizer
垂直布置在TextCtrl
下方。如果你把它们放在同一个Frame
中,这将自动发生。
但是,如果您将BoxSizer
直接放入Toolbar
,并将Frame
与Frame
放在同一个{{1}}中,没有告诉wx如何在{{1}}内布置控件。
答案 1 :(得分:1)
嗯,有几个问题
TextCtrl
添加到BoxSizer
,因此无法列出Frame
你可以这样做......
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(toolbar, 0, border=5)
vbox.Add(self.control, 1, border=5)
self.SetSizer(vbox)
...但最好使用Frame
的{{3}}方法,然后您不必担心其布局......
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
toolbar = self.CreateToolBar(style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.control, 1, border=5)
self.SetSizer(vbox)
......的确,如果TextCtrl
是框架中唯一的其他东西,你甚至不需要sizer ......
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test")
self.SetSize((600,500))
toolbar = self.CreateToolBar(style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.Realize()
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)