【问题标题】:How to center panel with controlled aspect ratio如何以受控的纵横比居中面板
【发布时间】:2015-02-03 18:27:40
【问题描述】:

在 wxPython 中,我无法将我创建的具有固定纵横比的子面板居中。

要控制纵横比,子面板需要捕获 Size 事件,然后执行显式 SetSize。所以,我已经做到了,而且效果很好。不幸的是,当我将此子面板嵌入到另一个面板中时(使用 sizer),wx.ALIGN_CENTER_HORIZONTAL 标志不起作用。

显然,sizer 告诉我的子面板它具有适合的整个宽度。当我的窗口不使用整个宽度时,sizer 不会调整。这是显示问题的代码的简化版本:

import wx

ROWS = 6
COLS = 25

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        label = wx.StaticText(self, -1, 'Label')
        grid  = TestGrid(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(label, 0, flag=wx.ALIGN_CENTER_HORIZONTAL)
        sizer.Add(grid,  1, flag=wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND)
        self.SetSizer(sizer)

class TestGrid(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.SetBackgroundColour(wx.BLUE)
        self.Bind(wx.EVT_SIZE,  self.OnSize)

    def OnSize(self, event):
        w, h = self.GetSizeTuple()
        delta = min(w // COLS, h // ROWS)
        self.SetSize((COLS*delta, ROWS*delta))
        self.Refresh()

if __name__ == '__main__':
    app = wx.App()
    frame = wx.Frame(None, -1, "Test", size=(600, 200))
    panel = TestPanel(frame)
    frame.Show(True)
    app.MainLoop()

这是一个屏幕截图:

【问题讨论】:

    标签: python wxpython wxwidgets aspect-ratio


    【解决方案1】:

    正如 VZ 在他的回答中解释的那样,您的 wxEVT_SIZE 处理程序不是一个好主意。去掉它。使用 sizer 时,您必须在 sizer 基础架构中工作才能实现您想要的。

    您希望TestGrid 在其父级中尽可能多地填充空间,同时保持一定的纵横比;这正是 wx.SHAPED 的用途(与大于 0 的 proportion 相结合,您已经拥有)。因此,您应该像这样将 grid 添加到 sizer 中:

    sizer.Add(grid,  1, flag=wx.ALIGN_CENTER_HORIZONTAL|wx.SHAPED)
    

    您唯一需要做的另一件事是告诉尺寸器您想要的纵横比是多少。最简单的方法是为您的TestGrid 设置一个初始大小(在添加到 sizer 之前);例如,设置其wxPanel base 的大小:

    wx.Panel.__init__(self, parent, -1, size=(COLS*7, ROWS*7))
    

    仅此而已。

    (我只是在猜测 Python 语法,所以请忽略任何明显的错误 :-))

    【讨论】:

      【解决方案2】:

      您不能,或者至少不应该,从它自己的wxEVT_SIZE 处理程序调整窗口大小。我不确定您到底想实现什么,但如果目标是将所有内容封装在 TestGrid 类中,那么您应该让它具有它拥有的任何大小并在其中创建一个嵌套窗口,您将调整为OnSize 中的适当大小。

      【讨论】:

        猜你喜欢
        • 2017-04-04
        • 2015-02-17
        • 2023-04-07
        • 2016-02-15
        • 2016-05-16
        • 2017-03-20
        • 2016-06-07
        • 1970-01-01
        • 2014-08-01
        相关资源
        最近更新 更多