Похоже, иерархическая структура wxPython неправильно определяет размер - PullRequest
0 голосов
/ 26 февраля 2019

Я не могу понять, почему мой иерархический макет не работает так, как я ожидаю в wxPython.

Основная идея заключается в следующем:

+- Win1 ------+ +- Win2 -----+ +- Win3 ----------+
|             | |            | |                 |
+-------------+ +------------+ +-----------------+
+- Win4 ----------+ +- Win5 ---------------------+
|                 | |                            |
+-----------------+ +----------------------------+
+- Win6 -----------------------------------------+
|                                                |
+------------------------------------------------+

Я создаю вертикальный макет блока дляобрабатывать три региона {1/2/3, 4/5, 6}.Внутри каждой из этих областей есть другой (горизонтальный) макет блока для обработки (например, в первой области) субрегионов {1, 2, 3}.

Затем внутри каждой из этих субрегионов у меня естьстатический блок размеров окна, чтобы дать мне границы с многострочным, не редактируемым пользователем, текстовым элементом управления.

Теперь приведенный ниже код был упрощен до двух строк с двумя столбцами в первой строке и одним ввторой.Только первый столбец в первой строке - это попытка нарисовать элемент управления nice-border, остальные - просто статические текстовые элементы управления.

import wx

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title, pos=(150,50), size=(1720,930))
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        self.topPanel = wx.Panel(self, wx.ID_ANY)

        self.screenPanel = wx.Panel(self.topPanel, wx.ID_ANY)
        self.spacer0 = wx.StaticText(self.topPanel, wx.ID_ANY, "")
        self.dummy1 = wx.StaticText(self.topPanel, wx.ID_ANY, "dummy1")
        self.dummy2 = wx.StaticText(self.topPanel, wx.ID_ANY, "dummy2")

        self.topSizer = wx.BoxSizer(wx.VERTICAL)
        self.row1Sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.row2Sizer = wx.BoxSizer(wx.HORIZONTAL)

        self.screenSizer = wx.StaticBoxSizer(wx.HORIZONTAL,
            self.screenPanel, "Screen")

        self.screen = wx.TextCtrl(self.screenPanel, wx.ID_ANY,
            "This is the first line\nXYZZY\nPLUGH",
            wx.DefaultPosition, wx.DefaultSize,
            wx.TE_MULTILINE | wx.TE_READONLY)

        self.row1Sizer.Add(self.screenSizer, 0, wx.ALL, 5)
        self.row1Sizer.Add(self.spacer0, 1, wx.ALL, 5)
        self.row1Sizer.Add(self.dummy1, 0, wx.ALL, 5)

        self.row2Sizer.Add(self.dummy2, 0, wx.ALL, 5)

        self.topSizer.Add(self.row1Sizer, 0, wx.ALL | wx.EXPAND, 5)
        self.topSizer.Add(self.row2Sizer, 0, wx.ALL | wx.EXPAND, 5)

        self.screenPanel.SetSizer(self.screenSizer)
        self.topPanel.SetSizer(self.topSizer)
        self.topPanel.Layout()

    def OnClose(self, event):
        self.Destroy()

app = wx.App()
top = MyFrame("My")
top.Show()
app.MainLoop()

Однако, похоже, есть некоторые проблемы, которые, как мне кажется, может быть вызвано моим заблуждением по поводу того, должны ли классификаторы или несайзеры владеть контролируемыми ресурсами, но я не могу заставить его вести себя.Код в том виде, в каком он есть, дает мне:

enter image description here

Как вы можете видеть, статическое поле, кажется, отсутствует вокруг первого элемента управления, и размеркажется облажался.Я бы подумал, что размер будет рассчитан на макете так, чтобы он был по крайней мере достаточно большим, чтобы вместить внутренний элемент управления и границу.

Может кто-нибудь сообщить мне, что я делаю неправильно с этим кодом?

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Ваш исходный код будет работать с несколькими модификациями.
Я все еще не могу разобраться в проблеме с добавлением screenPanel через screenSizer в row1Sizer, кроме screen, никогда не получитсядобавлен в сортировщик и не расширен.
Ваш измененный код (изменения указаны):

import wx

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title, pos=(150,50), size=(420,230))
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        self.topPanel = wx.Panel(self, wx.ID_ANY)

        ##self.screenPanel = wx.Panel(self.topPanel, wx.ID_ANY)
        self.spacer0 = wx.StaticText(self.topPanel, wx.ID_ANY, "")
        self.dummy1 = wx.StaticText(self.topPanel, wx.ID_ANY, "dummy1")
        self.dummy2 = wx.StaticText(self.topPanel, wx.ID_ANY, "dummy2")

        self.topSizer = wx.BoxSizer(wx.VERTICAL)
        self.row1Sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.row2Sizer = wx.BoxSizer(wx.HORIZONTAL)

        ##self.screenSizer = wx.StaticBoxSizer(wx.HORIZONTAL,
        ##    self.screenPanel, "Screen")
        self.screenSizer = wx.StaticBoxSizer(wx.HORIZONTAL,
            self.topPanel, "Screen")

        ##self.screen = wx.TextCtrl(self.screenPanel, wx.ID_ANY,
        self.screen = wx.TextCtrl(self.topPanel, wx.ID_ANY,
            "This is the first line\nXYZZY\nPLUGH",
            wx.DefaultPosition, wx.DefaultSize,
            wx.TE_MULTILINE | wx.TE_READONLY)

        ##Additional line
        self.screenSizer.Add(self.screen, 0, wx.ALL|wx.EXPAND, 5)
        ##
        self.row1Sizer.Add(self.screenSizer, 0, wx.ALL|wx.EXPAND, 5)
        self.row1Sizer.Add(self.spacer0, 1, wx.ALL, 5)
        self.row1Sizer.Add(self.dummy1, 0, wx.ALL, 5)

        self.row2Sizer.Add(self.dummy2, 0, wx.ALL, 5)

        self.topSizer.Add(self.row1Sizer, 0, wx.ALL | wx.EXPAND, 5)
        self.topSizer.Add(self.row2Sizer, 0, wx.ALL | wx.EXPAND, 5)

        ##self.screenPanel.SetSizer(self.screenSizer)
        self.topPanel.SetSizer(self.topSizer)
        self.topPanel.Layout()

    def OnClose(self, event):
        self.Destroy()

app = wx.App()
top = MyFrame("My")
top.Show()
app.MainLoop()

Результат: enter image description here

0 голосов
/ 26 февраля 2019

Статическое поле может быть создано независимо, или для удобства разработчик может создать его сам.В любом случае, sizer владеет элементом управления wx.StaticBox и удалит его в деструкторе wx.StaticBoxSizer.

Обратите внимание, что, начиная с wxWidgets 2.9.1, рекомендуется создавать окна, добавляемые в wx.StaticBoxSizer.как дети из wx.StaticBox

Так что-то вроде этого:

import wx

class MyFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title, pos=(150,50), size=(500,400))
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.SetMinSize((500,400))
        self.topPanel = wx.Panel(self, wx.ID_ANY)

        box1 = wx.StaticBox(self.topPanel, wx.ID_ANY, "Win1")
        box1.SetForegroundColour('#000000')

        self.textCtrl1 = wx.TextCtrl(box1, wx.ID_ANY,
            "This is the first line\nXYZZY\nPLUGH",
            wx.DefaultPosition, size = (200,100), style = wx.TE_MULTILINE | wx.TE_READONLY)
        self.dummy4 = wx.StaticText(box1, wx.ID_ANY, "Text below textctrl 1")

        boxSizer1 = wx.StaticBoxSizer(box1, wx.VERTICAL)
        boxSizer1.Add(self.textCtrl1, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)
        boxSizer1.Add(self.dummy4, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)

        box2 = wx.StaticBox(self.topPanel, wx.ID_ANY, "Win2")
        box2.SetForegroundColour('#000000')

        self.spacer = wx.StaticText(box2, wx.ID_ANY, "A spacer")

        boxSizer2 = wx.StaticBoxSizer(box2, wx.VERTICAL)
        boxSizer2.Add(self.spacer, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)

        box3 = wx.StaticBox(self.topPanel, wx.ID_ANY, "Win3")
        box3.SetForegroundColour('#000000')

        self.dummy1 = wx.StaticText(box3, wx.ID_ANY, "dummy text 1")

        boxSizer3 = wx.StaticBoxSizer(box3, wx.VERTICAL)
        boxSizer3.Add(self.dummy1, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)

        box4 = wx.StaticBox(self.topPanel, wx.ID_ANY, "Win4")
        box4.SetForegroundColour('#000000')

        self.textCtrl2 = wx.TextCtrl(box4, wx.ID_ANY,
            "This is the second line\nXYZZY\nPLUGH",
            wx.DefaultPosition, size = (200,100), style = wx.TE_MULTILINE | wx.TE_READONLY)

        boxSizer4 = wx.StaticBoxSizer(box4, wx.VERTICAL)
        boxSizer4.Add(self.textCtrl2, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)

        box5 = wx.StaticBox(self.topPanel, wx.ID_ANY, "Win5")
        box5.SetForegroundColour('#000000')

        self.dummy2 = wx.StaticText(box5, wx.ID_ANY, "dummy text 2")

        boxSizer5 = wx.StaticBoxSizer(box5, wx.VERTICAL)
        boxSizer5.Add(self.dummy2, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)

        box6 = wx.StaticBox(self.topPanel, wx.ID_ANY, "Win6")
        box6.SetForegroundColour('#000000')

        self.dummy3 = wx.StaticText(box6, wx.ID_ANY, "dummy text 3")

        boxSizer6 = wx.StaticBoxSizer(box6, wx.VERTICAL)
        boxSizer6.Add(self.dummy3, proportion = 0, flag=wx.ALIGN_CENTER|wx.EXPAND)

        self.topSizer = wx.BoxSizer(wx.VERTICAL)
        self.row1Sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.row2Sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.row3Sizer = wx.BoxSizer(wx.HORIZONTAL)


        self.row1Sizer.Add(boxSizer1, 0, wx.ALL, 5)
        self.row1Sizer.Add(boxSizer2, 1, wx.ALL|wx.EXPAND, 5) #Matches size of box1
        self.row1Sizer.Add(boxSizer3, 0, wx.ALL|wx.EXPAND, 5) #Matches size of box1

        self.row2Sizer.Add(boxSizer4, 0, wx.ALL, 5)
        self.row2Sizer.Add(boxSizer5, 1, wx.ALL, 5) # Does not match size of box4

        self.row3Sizer.Add(boxSizer6, 1, wx.ALL, 5)

        self.topSizer.Add(self.row1Sizer, 0, wx.ALL | wx.EXPAND, 5)
        self.topSizer.Add(self.row2Sizer, 0, wx.ALL | wx.EXPAND, 5)
        self.topSizer.Add(self.row3Sizer, 0, wx.ALL | wx.EXPAND, 5)

        self.topPanel.SetSizer(self.topSizer)
        self.topPanel.Layout()

    def OnClose(self, event):
        self.Destroy()

app = wx.App()
top = MyFrame("My Window Layout")
top.Show()
app.MainLoop()

enter image description here

Однако следует помнить, что иногдатема на рабочем столе вашей ОС не справляется с блоками, так что это не дано!
В частности, Mint-X в Linux Mint с треском проваливается, тот же код с темой Mint-X выглядит следующим образом.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...