Элементы управления wxpython собраны в левом верхнем углу - PullRequest
0 голосов
/ 17 мая 2018

Я очень плохо знаком с wxpython.

Моя цель - создать пользовательский интерфейс, состоящий из двух горизонтальных панелей с определенными элементами управления.Я получил ControlPanel из wx.Panel, который я хочу интегрировать в мейнфрейм.controlPanel состоит из wx.staticBox и двух «sub» wx.StaticBox, куда добавляются некоторые элементы управления.Каким-то образом, когда окно открывается, элементы управления отображаются в верхнем левом углу staticBox, как показано на этом изображении

Вы можете объяснить, почему элементы управления не распространяются в staticBoxes изэтот набор кода:

import wx
from wx._core import ID_ANY

from collections import namedtuple

class mvtControlPanelUI(wx.Panel):
    m_mainCtrBoxSizer = []
    m_mainCtrStaticBox = []
    m_commonControlsBox = []
    m_customControlsBox = []
    m_inputDataPathStruct = []
    m_outputDataPathStruct = []
    m_commonCtrlSizer = []
    m_inputDataCtrlSizer = []
    m_outputDataCtrlSizer = []

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, name="controlPanel")
        self.SetBackgroundColour('white')
        self.m_mainCtrStaticBox = wx.StaticBox(self, label = "Controls")
        self.m_mainCtrBoxSizer = wx.StaticBoxSizer(self.m_mainCtrStaticBox,
                                  wx.VERTICAL)

        # common controls
        self.initCustomControls()


        self.initCommonControls()
        self.SetSizer(self.m_mainCtrBoxSizer)
        self.Layout()


#     common control initialization
    def initCommonControls(self):

        #input data controls
        self.m_commonControlsBox = wx.StaticBox(self.m_mainCtrStaticBox, -1, "Common controls");
        #common control sizer
        self.m_commonCtrlSizer = wx.StaticBoxSizer(self.m_commonControlsBox, wx.VERTICAL)
        #input data controls sizer
        self.m_inputDataCtrlSizer = wx.BoxSizer(wx.HORIZONTAL)

        # Create the struct
        self.m_inputDataPathStruct = namedtuple("staticText", "editBox", "browseBn")
        # static text
        self.m_inputDataPathStruct.staticText  = wx.StaticText(self.m_commonControlsBox, -1, "Input data path:", style = wx.ALIGN_LEFT)
        self.m_inputDataCtrlSizer.Add(self.m_inputDataPathStruct.staticText, 0, wx.ALL|wx.CENTER, 5)
        # text box 
        self.m_inputDataPathStruct.editBox  = wx.TextCtrl(self.m_commonControlsBox, -1, "/path/to/data/folder", style = wx.ALIGN_LEFT)
        self.m_inputDataCtrlSizer.Add(self.m_inputDataPathStruct.editBox, 0, wx.ALL|wx.CENTER, 5)
        # browse button
        self.m_inputDataPathStruct.browseBn  = wx.Button(self.m_commonControlsBox, -1, "...", style = wx.ALIGN_LEFT)
        self.m_inputDataCtrlSizer.Add(self.m_inputDataPathStruct.browseBn, 0, wx.ALL|wx.CENTER, 5)
        # insert input controls sizer in common control sizer
        self.m_commonCtrlSizer.Add(self.m_inputDataCtrlSizer, 1, wx.ALL|wx.CENTER, 10)
        #add common control box to the mainControl box sizer
        self.m_mainCtrBoxSizer.Add(self.m_commonControlsBox, 1, wx.ALL|wx.EXPAND, 10)


    # 
    def initCustomControls(self):
        self.m_customControlsBox = wx.StaticBox(self.m_mainCtrStaticBox, -1, "custom controls");
        #custom control sizer
        self.m_customCtrlSizer = wx.StaticBoxSizer(self.m_customControlsBox, wx.VERTICAL)

        #static text
        staticText = wx.StaticText(self.m_customControlsBox, -1, "custom Controls go Here", style = wx.ALIGN_LEFT)

        self.m_customCtrlSizer.Add(staticText, 1, wx.ALL|wx.CENTER, 10)
        self.m_mainCtrBoxSizer.Add(self.m_customControlsBox, 4, wx.ALL|wx.EXPAND, 10)

MainFrame:

import wx

import baseUI.mvtControlPanelUI as cPnl
import baseUI.mvtResultsPanelUI as rPnl

TBFLAGS = ( wx.TB_HORIZONTAL
            | wx.NO_BORDER
            | wx.TB_FLAT
            #| wx.TB_TEXT
            #| wx.TB_HORZ_LAYOUT
            )

class mvtMainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, wx.ID_ANY, 'myAwesomeFrame', size=(600, 400))

        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

#       panels
        mainPanel = wx.Panel(self)
        controlPnl =  cPnl.mvtControlPanelUI(mainPanel)
        resultsPnl = rPnl.mvtResultsPanelUI(mainPanel)

#       Main Panel sizer wraps control and results panels
        mainFrameSizer = wx.BoxSizer(wx.VERTICAL)
        mainPnlSizer = wx.BoxSizer(wx.HORIZONTAL)
        mainPnlSizer.Add(controlPnl, proportion = 1, flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP)
        mainPnlSizer.Add(resultsPnl, proportion = 3, flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP)
        mainPanel.SetSizer(mainFrameSizer)

#         mainFrameSizer.Add(self._ribbon, 0, wx.EXPAND)
        mainFrameSizer.Add(mainPnlSizer, 1, wx.EXPAND)

        self.CreateStatusBar()
        self.Layout()

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

    def OnFullScreen(self, event):
        self.ShowFullScreen(not self.IsFullScreen(), 0)

1 Ответ

0 голосов
/ 20 мая 2018

Следующий код дает то, что, я думаю, вы ищете (только для одной из панелей).
Проблема в вашем коде связана с назначением родительских и дочерних виджетов.
С другой стороны, мойсоветую вам не усложнять ваш код больше, чем просто необходимо.Очень длинные имена, слишком подробные имена, иногда могут скрывать структуру кода.
Вы также можете воспользоваться такими приложениями, как wxglade, для создания своего пользовательского интерфейса более «безопасным» и чистым способом

import wx

class ControlPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, name="controlPanel")
        self.SetBackgroundColour('white')
        self.mainBox = wx.StaticBox(self, label ="Controls")
        self.mainSizer = wx.StaticBoxSizer(self.mainBox, wx.VERTICAL)

        self.initCustomControls()
        self.initCommonControls()

        self.SetSizer(self.mainSizer)
        self.Layout()

    def initCommonControls(self):
        self.commonBox = wx.StaticBox(self, -1, "Common controls");
        self.commonSizer = wx.StaticBoxSizer(self.commonBox, wx.VERTICAL)

        self.text  = wx.StaticText(self, -1, "Input data path:", style = wx.ALIGN_LEFT)
        self.editBox = wx.TextCtrl(self, -1, "/path/to/data/folder", style=wx.ALIGN_LEFT)
        self.browseBn = wx.Button(self, -1, "...", style=wx.ALIGN_LEFT)

        self.commonSizer.Add(self.text, 0, wx.ALL | wx.CENTER, 5)
        self.commonSizer.Add(self.editBox, 0, wx.ALL | wx.CENTER, 5)
        self.commonSizer.Add(self.browseBn, 0, wx.ALL | wx.CENTER, 5)

        self.mainSizer.Add(self.commonSizer, 1, wx.ALL | wx.EXPAND, 10)

    def initCustomControls(self):
        self.customBox = wx.StaticBox(self, -1, "custom controls");
        self.customSizer = wx.StaticBoxSizer(self.customBox, wx.VERTICAL)

        staticText = wx.StaticText(self, -1, "custom Controls go Here", style = wx.ALIGN_LEFT)

        self.customSizer.Add(staticText, 1, wx.ALL|wx.CENTER, 10)
        self.mainSizer.Add(self.customSizer, 4, wx.ALL | wx.EXPAND, 10)


class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, wx.ID_ANY, 'myAwesomeFrame', size=(400, 400))

        controlPnl = ControlPanel(self)
        mainPnlSizer = wx.BoxSizer(wx.HORIZONTAL)
        mainPnlSizer.Add(controlPnl, proportion = 1, flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP)
        self.SetSizer(mainPnlSizer)
        self.CreateStatusBar()
        self.Layout()


if __name__ == "__main__":
    app = wx.App()
    f = MyFrame(None)
    f.Show(True)
    app.MainLoop()

Выполучить:

enter image description here

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