wxPython官方文档中文翻译 - 窗口尺寸概述

127 阅读4分钟

官方文档:docs.wxpython.org/window_sizi…

有时,要弄清楚wx.Window各种与尺寸相关的属性、它们之间的相互关系以及它们与布局管理器的交互方式,可能会让人感到困惑。

本文档将尝试稍微拨开迷雾,并对相关内容给出一些简单的解释。

术语

  • “Best Size” :一个组件的最佳尺寸取决于它是哪种类型的组件,而且通常还取决于该组件的内容。例如,一个wx.ListBox的最佳尺寸将根据其包含的项目数量来计算,但会有一定的限制;或者一个wx.Button的最佳尺寸将根据其标签的大小来计算,但通常不会小于平台默认的按钮尺寸(除非某个样式标志覆盖了该默认值)。在wxPython的窗口类中有一个特殊的方法,名为wx.Window.DoGetBestSize,如果某个类想要根据自身内容来计算其最佳尺寸,就需要重写这个方法。
  • “Minimal Size” :一个组件的最小尺寸通常是由程序员通过wx.Window.SetMinSize方法或wx.Window.SetSizeHints方法显式设置的尺寸。如果传递了非默认值,大多数控件也会将最小尺寸设置为在控件构造函数中指定的尺寸。像wx.Frame这样的顶级窗口不允许用户将窗口大小调整到小于最小尺寸。
  • “Maximum Size”: 与最小尺寸的设置类似,最大尺寸通常也是由程序员通过wx.Window.SetMaxSize方法或wx.Window.SetSizeHints方法显式设置的。像wx.Frame这样的顶级窗口不允许用户将窗口大小调整到超过最大尺寸。
  • “Size”: 一个组件的尺寸可以通过wx.Window.SetSizewx.Window.GetSize方法来显式设置或获取。这个尺寸值是该组件当前在屏幕上所使用的尺寸,并且是改变那些不受布局管理器管理的组件尺寸的方式。
  • “Client Size”: 客户端尺寸表示组件在其自身任何边框内部的区域,并且是在wx.EVT_PAINT事件中可以进行绘制的区域。如果一个组件没有边框,那么它的客户端尺寸就和它的整体尺寸相同。
  • “Initial Size”: 如上文所述,大多数控件还会将这个尺寸值设置为该控件的最小尺寸。如果传递给构造函数的尺寸是默认的wx.DefaultSize,或者如果尺寸没有被完整指定(例如wx.Size(150, -1)),那么大多数控件会使用最佳尺寸来填充缺失的尺寸参数,并会将该控件的初始尺寸设置为最终得到的尺寸。
  • “Virtual Size”: 虚拟尺寸是指组件潜在可查看区域的尺寸。一个组件的虚拟尺寸可能会大于其实际尺寸,在这种情况下,会出现滚动条,以便让用户能够“浏览”该组件的全部内容。更多信息请参阅wx.Scrolled

与尺寸相关的函数

  • wx.Window.GetEffectiveMinSize:返回一个组件最小尺寸和最佳尺寸的混合值,其中最小尺寸优先考虑。例如,如果一个组件的最小尺寸设置为(150, -1)且最佳尺寸为(80, 22),那么最适配的尺寸就是(150, 22)。如果最小尺寸是(50, 20),那么最适配的尺寸就是(50, 20)。当布局管理器确定其内部每个项目的需求时,就会调用这个方法,它被用于计算布局管理器的整体最小需求。
  • wx.Window.SetInitialSize:这与典型的尺寸设置方法略有不同。它并非仅仅设置一个“初始尺寸”属性,实际上是将最小尺寸设置为传入的值,将该值与最佳尺寸进行混合,然后将组件的尺寸设置为混合后的结果。所以你可以把这个方法看作是一种“智能设置尺寸”的方法。大多数控件的构造函数会调用这个方法来设置控件的最小尺寸和初始尺寸。
  • wx.Window.Fit:此方法会设置一个窗口的大小,使其能够适配其内部的子窗口。如果该窗口没有子窗口,那么不会进行任何操作;如果它有子窗口,那么该窗口的大小将被设置为其最佳尺寸。
  • wx.Sizer.Fit:这个方法会将窗口的大小设置为足够大,以容纳布局管理器所需的最小尺寸(以及其他一些限制条件……)。如果该布局管理器是分配给此窗口的那个,那么这应该等同于wx.Window.Fit方法的效果。
  • wx.Sizer.Layout:重新计算布局管理器中每个项目所需的最小空间,然后在当前分配给布局管理器的空间内对这些项目进行布局。
  • wx.Window.Layout:如果该窗口有一个布局管理器,那么它会将分配给布局管理器的空间设置为窗口的当前尺寸,这会导致调用wx.Sizer.Layout方法。如果该窗口采用的是布局约束而非布局管理器,那么就会运行约束算法。对于容器窗口,默认的wx.EVT_SIZE事件处理程序会调用Layout() 方法。