【问题标题】:Cant add a text control without blocking the toolbar in wxpython无法在不阻止 wxpython 中的工具栏的情况下添加文本控件
【发布时间】:2013-05-11 18:16:09
【问题描述】:

我在这里重现了错误;

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)

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

【问题讨论】:

  • 我相信您在这里遗漏了导致问题的关键代码行。请发布演示问题的示例,而不是(或除此之外)发布不同的代码,然后尝试描述导致问题的更改。
  • 但我有一个猜测:您没有将TextCtrl 添加到BoxSizer,而是将其直接添加到FrameBoxSizer 的全部意义在于自动布置其子小部件,因此您只需添加另一个控件,它就会出现在前一个控件的下方,这听起来正是您想要的。
  • @abarnert 这个精确的代码显示了问题,文本控件将自身放置在工具栏上。你得到不同的输出吗?实际代码有点长,大多数变量和函数名称都是土耳其语。如果你愿意,我可以放一个 pastebin 链接。对于第二条评论,我试过了,但什么也没发生,但我会再做一次。

标签: python wxpython sizer


【解决方案1】:

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

vbox.Add(self.control)

或者,如果TextCtrl 没有在__init__ 内部构建,则将其设为self.vbox.Add,当然也将__init__ 中的vbox 引用更改为self.vbox

引用the docs:

box sizer 背后的基本理念是,窗口通常会以相当简单的基本几何图形布局,通常以一行或一列或两者的嵌套层次结构排列。 wx.BoxSizer 将根据传递给构造函数的方向参数将其项目布置在一个简单的行或列中。

这正是您想要的——您想将TextCtrl 垂直放置在Toolbar 下方。如果您将它们都放入同一个BoxSizer,这将自动发生。

但是如果你把TextCtrl直接放到Frame里面,同时把里面有ToolbarBoxSizer放到同一个Frame里面,你还没有告诉wx怎么布局Frame 中的控件。

【讨论】:

  • 我在vbox.Add(toolbar, 0, border=5) 之后添加了vbox.Add(control),但没有任何变化。我错过了什么?
  • @ÇağdaşSalur 请参阅下面的答案。
【解决方案2】:

嗯,有几个问题

  1. 您尚未将 TextCtrl 添加到 BoxSizer,因此不会布局
  2. 您还没有为Frame 设置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)

...但是使用FrameCreateToolBar()方法可能会更好,那么您不必担心它的布局...

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)

【讨论】:

  • 我在你的第一个例子中使用了sizer,现在它没有显示在工具栏上,但它向左对齐并且非常窄。我怎样才能使控件填充整个区域?
  • @ÇağdaşSalur:如果不编写中等规模的教程,任何人都无法回答您的问题,这不适合 SO。通过a simple tutorial 工作,然后阅读Sizer 文档以了解未涵盖的任何细节。一旦你掌握了 wx 中小部件布局的基础知识,你想要做的事情就很明显了;在你这样做之前,这几乎是不可能的。
  • @abarnert 谢谢,我会调查的。
  • @ÇağdaşSalur 如果您在构造和显示框架之后添加文本控件,您可能需要通过调用self.GetSizer().Layout() on 让sizer 再次进行布局框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2018-12-13
相关资源
最近更新 更多