无法阻止wxpython中的工具栏添加文本控件

时间:2013-05-16 18:06:48

标签: python wxpython sizer

我在这里重现了错误;

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)

它出现在工具栏上。我阅读了文档并遵循了一些教程,但仍然无法完全掌握这个概念。我怎样才能实现我想要的?我希望文本控件显示在工具栏下方并适合剩余的空间。

2 个答案:

答案 0 :(得分:1)

没有看到实际的问题代码,很难确定,但我打赌你想要这个:

vbox.Add(self.control)

或者,如果TextCtrl内未构建__init__,请设置self.vbox.Add,当然会将vbox中的__init__引用更改为self.vbox TextCtrl

引自the docs

  

box sizer背后的基本思想是,窗口通常以相当简单的基本几何图形排列,通常是行或列或两者的嵌套层次结构。 wx.BoxSizer将在简单的行或列中布置其项目,具体取决于传递给构造函数的orientation参数。

这正是您想要的 - 您想要ToolbarBoxSizer垂直布置在TextCtrl下方。如果你把它们放在同一个Frame中,这将自动发生。

但是,如果您将BoxSizer直接放入Toolbar,并将FrameFrame放在同一个{{1}}中,没有告诉wx如何在{{1}}内布置控件。

答案 1 :(得分:1)

嗯,有几个问题

  1. 您尚未将TextCtrl添加到BoxSizer,因此无法列出
  2. 您尚未为Frame
  3. 设置sizer

    你可以这样做......

    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)