Почему wx Python вырезает некоторые части моего макета / окна? - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть приложение wy Python, которое отображает GUI, полученное из wx.Frame. Это окно GUI состоит из панели прокрутки для отображения изображений (wx.StaticBitmap), панели под ней для некоторых строк ввода и другой панели для некоторых строк информации или текста. Все работает отлично, вот скриншот того, как должно выглядеть окно (как из моего минимального рабочего примера, см. Ниже):

enter image description here

Примечание в В частности, в нижней части окна, где вы можете найти четыре строки текста - все как положено. Однако, когда я теперь устанавливаю минимальную высоту для панели растрового изображения, нижняя часть текстовой панели ниже обрезается или обрезается, например:

enter image description here

Когда я устанавливаю переменную MIN_IMAGE_SCROLL_AREA_HEIGHT в 600, тогда она работает нормально, но когда она установлена ​​в 700, я сталкиваюсь с этим проблемным поведением c. Но я не вижу проблемы в своем коде, вы можете мне помочь?

Вот минимально работающий пример:

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()

1 Ответ

1 голос
/ 30 апреля 2020

Изменение расположения и подгонки, кажется, исправляет это в Linux с wx Python 4.1.0
Замена

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

на:

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

кажется делать работу.

enter image description here

Примечание: вы используете размер на уровне панели, но не на уровне кадра, т.е. self, это само по себе будет вызвать проблему, когда дело доходит до fitting внутри окна (фрейма).

...