Я не могу понять, почему мой иерархический макет не работает так, как я ожидаю в 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](https://i.stack.imgur.com/ery6b.png)
Как вы можете видеть, статическое поле, кажется, отсутствует вокруг первого элемента управления, и размеркажется облажался.Я бы подумал, что размер будет рассчитан на макете так, чтобы он был по крайней мере достаточно большим, чтобы вместить внутренний элемент управления и границу.
Может кто-нибудь сообщить мне, что я делаю неправильно с этим кодом?
При выходе также происходит сбой, что может быть связано.Если нет, я могу рассмотреть это как отдельную проблему.