【问题标题】:how to stop growing width of window when child sizers width increased in wx.Dialog in wxpython当 wxpython 中的 wx.Dialog 中的子尺寸器宽度增加时,如何停止窗口宽度的增加
【发布时间】:2016-05-09 09:47:25
【问题描述】:

我对 wxpython 和 wxwidgets 很陌生。我有 wx.Dialog 的代码,如下所示。

def __init__(self, parent, Name, Platform):
    wx.Dialog.__init__(self, parent, -1, 'Launch Dialog', size=(-1,-1), pos=(-1,-1))
     ###some code 
    self.createSizers()
    self.Fit() 

def createSizers()
    self.mainSizer = wx.BoxSizer(wx.VERTICAL)
    SelectionSizer = wx.StaticBoxSizer(self.staticBoxTestSelection, wx.VERTICAL)
    self.horzDetailsSizer = wx.BoxSizer(wx.HORIZONTAL) 
    self.DetailsSizer = wx.BoxSizer(wx.VERTICAL)
    ### add func here

    self.ListingSizer = wx.BoxSizer(wx.VERTICAL)
    ### add func here

     # Horizontal Splitter
    self.horzDetailsSizer.Add(self.ListingSizer, 3, wx.EXPAND)
    self.horzDetailsSizer.AddSpacer(5)
    self.horzDetailsSizer.Add(self.DetailsSizer, 2, wx.EXPAND)

    # Add subsizers to main
    SelectionSizer.Add(self.horzDetailsSizer, 1, wx.EXPAND | wx.ALL, 5)

    self.mainSizer.Add(SelectionSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5)

     ### Initialize mainSize
    self.SetSizer(self.mainSizer)

这里的问题是当 self.DetailsSizer 的 statictextctrl sizers 或 listctrl sizers 增加整个窗口大小的宽度并且窗口右侧的 subsizers 宽度也在增加时。

我希望固定对话框的大小,并且subsizer应该在窗口大小内调整。即如果一个subsizer宽度增加,相邻的subsizer应该随着空间调整..

有没有办法做到这一点?请帮我解决这个问题。

编辑

这不是关于用户调整对话框窗口的大小。它是关于对话框的宽度动态水平增长。

例如。在我的对话框中,我在默认大小(-1,-1)的窗口中有 2 个名为列表和详细信息的框大小器。

在详细信息框中,我正在动态显示“名称”,这与列表尺寸器中的选定选项相关。所以“名称”的长度每次都会改变。如果长度更大并且字符串是单个单词details sizer 的宽度水平增加,因此列表 sizer 增加。所以窗口的 main sizer 增加如下。

我不希望这种增长并再次进入正常窗口。窗口大小应始终固定,如果细节尺寸器中“名称”长度增加,列表尺寸器应缩小并随细节尺寸器调整。

普通对话框:

动态宽度增加:

想要的输出是:

【问题讨论】:

  • 不清楚您的期望是什么。您是否希望对话框具有固定大小,以便用户无法调整它的大小?或者用户应该能够调整它的大小,但右边的空间应该保持不变?请澄清。
  • 不,它实际上不是关于用户调整窗口的。它是动态地水平调整窗口的大小,例如。文本大小(字符串长度)在任何一个 subsizer 中增加或减少都会改变窗口的宽度(水平 sizer)以及 subsizer。寡妇的宽度应该始终固定,即使子尺寸器宽度增加,以便它应该与其他子尺寸器一起管理空间。我不知道如何在 wxDialog 中做到这一点

标签: wxpython wxwidgets


【解决方案1】:

也许你需要添加一个没有比例的sizer。看这段代码

# Horizontal Splitter
self.horzDetailsSizer.Add(self.ListingSizer, 3, wx.EXPAND) # This Line need to be changed
self.horzDetailsSizer.AddSpacer(5)
self.horzDetailsSizer.Add(self.DetailsSizer, 2, wx.EXPAND)

当你把比例设为 0 时,孩子不会在 x 轴上生长,只会在 y 轴上(因为使用了wx.EXPAND)。尝试像下面的代码进行更改

self.horzDetailsSizer.Add(self.ListingSizer, 0, wx.EXPAND)

此博客 (http://www.blog.pythonlibrary.org/2013/11/06/wxpython-101-using-frame-styles) 对 wx Flags 进行了解释。要制作不调整大小的对话框,请尝试放置:

class TestDialog(wx.Dialog):
    def __init__(self,parent)
        dialogStyle = wx.DEFAULT_DIALOG_STYLE& ~ (wx.RESIZE_BORDER | wx.RESIZE_BOX | wx.MAXIMIZE_BOX)
        wx.Dialog.__init__(self, parent, -1, style=dialogStyle)

【讨论】:

  • 这很好用..但是如果 detailSizers 内容增加,我可以为 ListingSizer 中的水平滚动条做什么?
【解决方案2】:

我不确定我是否理解您的问题,但您正在调用Fit(),以便将您的对话框宽度设置为最适合其内容的任何内容。如果您不希望这种情况发生,正如我解释您的问题一样,请不要致电Fit()。当然,这可能会导致对话框太窄而无法显示其中的所有内容,这就是为什么调用Fit() 通常是个好主意,但是否这样做是您的选择。

【讨论】:

  • 我试图删除 Fit() 但它仍然在水平增长:-(
  • wx.Dialog.__init__(self, parent, -1, 'Launch Dialog', size=(-1,-1), pos=(-1,-1)) 在这里我将大小更改为 (870,700) 但它保持不变
  • @Nithya,作为 Vadim,我也不明白这个问题。您是否试图阻止用户调整对话框的大小?如果没有,您能否制作初始屏幕截图、现在正在发生的事情以及您希望看到的内容?谢谢。
  • 对话真的不只是自己成长。如果您不调用Fit(),则对话框大小应该是您为其明确设置的任何大小,或者默认使用的某个默认(但固定)大小。
  • Fit() 已被删除,但行为没有改变,我也无法设置大小。
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多