wxPython为什么要剪切我的布局/窗口的某些部分?

问题描述 投票:2回答:1

我有一个wyPython应用程序,该应用程序呈现从wx.Frame派生的GUI。该GUI窗口包括一个用于渲染图像的滚动窗格(wx.StaticBitmap),一个位于某些输入行下方的面板以及一个用于某些信息或文本行的面板。一切正常,这是窗口外观的屏幕截图(如我的最小工作示例所示):

enter image description here

请特别注意窗口的底部,您可以在其中找到四个文本行-一切如预期。但是,当我现在为位图面板设置最小高度时,下面的文本面板的下部将被剪切或剪切,如下所示:

enter image description here

当我将变量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()
python user-interface wxpython
1个回答
1
投票

[颠倒布局和契合度似乎可以在Linux上使用wxPython 4.1.0修复它。替换

self.main_sizer.Fit(self)
self.main_panel.Layout()

with:

self.main_panel.Layout()
self.main_panel.Fit()

似乎可以完成这项工作。

enter image description here

注意:您在面板级别而不是在帧级别使用缩放器,即self,当涉及到窗口(帧)中的fitting时,这本身会引起问题。

© www.soinside.com 2019 - 2024. All rights reserved.