为什么 wxPython 会剪切我布局的某些部分/window?
Why does wxPython cut some parts of my layout / window?
我有一个 wyPython 应用程序,它呈现从 wx.Frame
派生的 GUI。该 GUI window 由一个用于呈现图像的滚动窗格 (wx.StaticBitmap
)、一个位于其下方的用于某些输入行的面板以及另一个用于某些信息或文本行的面板组成。一切正常,这里是 window 的截图(来自我的最小工作示例,见下文):
请特别注意 window 的底部,您可以在其中找到四行文本 - 一切如预期。但是,当我现在为位图面板设置最小高度时,下面的文本面板的下部会被剪切或剪裁,如下所示:
当我将变量 MIN_IMAGE_SCROLL_AREA_HEIGHT
设置为 600
时,它工作正常,但是当设置为 700
时,我遇到了这个有问题的行为。但是我没有在我的代码中看到问题,你能帮我吗?
这是一个完全可用的最小示例:
import wx
import wx.grid
import wx.lib.intctrl
import wx.lib.inspection
import wx.lib.scrolledpanel
class TestApp(wx.Frame):
DEF_IMAGE_SIZE = 800
MIN_IMAGE_SCROLL_AREA_HEIGHT = 700 # with 600 it works correctly
def __init__(self):
super(TestApp, self).__init__(None, title="wxPython Test", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
self.init_panel()
self.Center()
self.Show()
def init_panel(self):
self.main_panel = wx.Panel(self)
self.bitmaps_panel = wx.lib.scrolledpanel.ScrolledPanel(self.main_panel)
self.bitmaps_panel.SetMinSize((-1, self.MIN_IMAGE_SCROLL_AREA_HEIGHT))
self.bitmaps_panel.SetBackgroundColour("black")
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
self.main_panel.SetSizer(self.main_sizer)
self.bitmaps_sizer = wx.BoxSizer(wx.VERTICAL)
self.bitmaps_panel.SetSizer(self.bitmaps_sizer)
bitmap = wx.Bitmap(wx.Image(self.DEF_IMAGE_SIZE, self.DEF_IMAGE_SIZE))
self.bitmaps_sizer.Add(wx.StaticBitmap(self.bitmaps_panel, wx.ID_ANY, bitmap))
self.bitmaps_sizer.Fit(self)
self.main_sizer.Add(self.bitmaps_panel, 0, flag=wx.EXPAND)
self.main_sizer.AddSpacer(5)
self.main_sizer.Add(wx.StaticLine(self.main_panel, wx.ID_ANY, size=(self.DEF_IMAGE_SIZE + 30, 1)))
self.main_sizer.AddSpacer(10)
self.input_panel = wx.Panel(self)
self.input_sizer = wx.BoxSizer(wx.VERTICAL)
self.input_panel.SetSizer(self.input_sizer)
self.input_sizer.Add(wx.StaticText(self.input_panel, wx.ID_ANY, label="Input Line"), 0, wx.EXPAND)
self.main_sizer.Add(self.input_panel, 0, flag=wx.EXPAND)
self.main_sizer.AddSpacer(10)
self.main_sizer.Add(wx.StaticLine(self.main_panel, wx.ID_ANY, size=(self.DEF_IMAGE_SIZE + 30, 1)))
self.main_sizer.AddSpacer(10)
self.stats_panel = wx.Panel(self)
self.stats_sizer = wx.BoxSizer(wx.VERTICAL)
self.stats_panel.SetSizer(self.stats_sizer)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 1"), 0, wx.EXPAND)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 2"), 0, wx.EXPAND)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 3"), 0, wx.EXPAND)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 4"), 0, wx.EXPAND)
self.main_sizer.Add(self.stats_panel, 0, flag=wx.EXPAND)
self.main_sizer.AddSpacer(10)
self.main_sizer.Add(wx.StaticLine(self.main_panel, wx.ID_ANY, size=(self.DEF_IMAGE_SIZE + 30, 1)))
self.main_sizer.AddSpacer(1)
self.main_sizer.Fit(self)
self.main_panel.Layout()
if __name__ == "__main__":
wxapp = wx.App()
app = TestApp()
wxapp.MainLoop()
在 Linux 下使用 wxPython 4.1.0
反转布局和适合似乎可以修复它
正在替换
self.main_sizer.Fit(self)
self.main_panel.Layout()
与:
self.main_panel.Layout()
self.main_panel.Fit()
似乎可以胜任。
注意:您在面板级别而不是在框架级别使用 sizer,即 self
,这本身会导致问题,当涉及到 [=27] 中的 fitting
时=](帧)。
我有一个 wyPython 应用程序,它呈现从 wx.Frame
派生的 GUI。该 GUI window 由一个用于呈现图像的滚动窗格 (wx.StaticBitmap
)、一个位于其下方的用于某些输入行的面板以及另一个用于某些信息或文本行的面板组成。一切正常,这里是 window 的截图(来自我的最小工作示例,见下文):
请特别注意 window 的底部,您可以在其中找到四行文本 - 一切如预期。但是,当我现在为位图面板设置最小高度时,下面的文本面板的下部会被剪切或剪裁,如下所示:
当我将变量 MIN_IMAGE_SCROLL_AREA_HEIGHT
设置为 600
时,它工作正常,但是当设置为 700
时,我遇到了这个有问题的行为。但是我没有在我的代码中看到问题,你能帮我吗?
这是一个完全可用的最小示例:
import wx
import wx.grid
import wx.lib.intctrl
import wx.lib.inspection
import wx.lib.scrolledpanel
class TestApp(wx.Frame):
DEF_IMAGE_SIZE = 800
MIN_IMAGE_SCROLL_AREA_HEIGHT = 700 # with 600 it works correctly
def __init__(self):
super(TestApp, self).__init__(None, title="wxPython Test", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
self.init_panel()
self.Center()
self.Show()
def init_panel(self):
self.main_panel = wx.Panel(self)
self.bitmaps_panel = wx.lib.scrolledpanel.ScrolledPanel(self.main_panel)
self.bitmaps_panel.SetMinSize((-1, self.MIN_IMAGE_SCROLL_AREA_HEIGHT))
self.bitmaps_panel.SetBackgroundColour("black")
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
self.main_panel.SetSizer(self.main_sizer)
self.bitmaps_sizer = wx.BoxSizer(wx.VERTICAL)
self.bitmaps_panel.SetSizer(self.bitmaps_sizer)
bitmap = wx.Bitmap(wx.Image(self.DEF_IMAGE_SIZE, self.DEF_IMAGE_SIZE))
self.bitmaps_sizer.Add(wx.StaticBitmap(self.bitmaps_panel, wx.ID_ANY, bitmap))
self.bitmaps_sizer.Fit(self)
self.main_sizer.Add(self.bitmaps_panel, 0, flag=wx.EXPAND)
self.main_sizer.AddSpacer(5)
self.main_sizer.Add(wx.StaticLine(self.main_panel, wx.ID_ANY, size=(self.DEF_IMAGE_SIZE + 30, 1)))
self.main_sizer.AddSpacer(10)
self.input_panel = wx.Panel(self)
self.input_sizer = wx.BoxSizer(wx.VERTICAL)
self.input_panel.SetSizer(self.input_sizer)
self.input_sizer.Add(wx.StaticText(self.input_panel, wx.ID_ANY, label="Input Line"), 0, wx.EXPAND)
self.main_sizer.Add(self.input_panel, 0, flag=wx.EXPAND)
self.main_sizer.AddSpacer(10)
self.main_sizer.Add(wx.StaticLine(self.main_panel, wx.ID_ANY, size=(self.DEF_IMAGE_SIZE + 30, 1)))
self.main_sizer.AddSpacer(10)
self.stats_panel = wx.Panel(self)
self.stats_sizer = wx.BoxSizer(wx.VERTICAL)
self.stats_panel.SetSizer(self.stats_sizer)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 1"), 0, wx.EXPAND)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 2"), 0, wx.EXPAND)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 3"), 0, wx.EXPAND)
self.stats_sizer.Add(wx.StaticText(self.stats_panel, wx.ID_ANY, label="Test Line 4"), 0, wx.EXPAND)
self.main_sizer.Add(self.stats_panel, 0, flag=wx.EXPAND)
self.main_sizer.AddSpacer(10)
self.main_sizer.Add(wx.StaticLine(self.main_panel, wx.ID_ANY, size=(self.DEF_IMAGE_SIZE + 30, 1)))
self.main_sizer.AddSpacer(1)
self.main_sizer.Fit(self)
self.main_panel.Layout()
if __name__ == "__main__":
wxapp = wx.App()
app = TestApp()
wxapp.MainLoop()
在 Linux 下使用 wxPython 4.1.0
反转布局和适合似乎可以修复它
正在替换
self.main_sizer.Fit(self)
self.main_panel.Layout()
与:
self.main_panel.Layout()
self.main_panel.Fit()
似乎可以胜任。
注意:您在面板级别而不是在框架级别使用 sizer,即 self
,这本身会导致问题,当涉及到 [=27] 中的 fitting
时=](帧)。