wxPython - проблема с вложенными сайзерами, панелью и SetSizer / Fit - PullRequest
0 голосов
/ 09 июля 2011

В настоящее время я пытаюсь получить контроль над wxPython, и я наткнулся на скейтеры, разместив их на панели и поместив их.

Я хочу иметь GridBagSizer в StaticBoxSizer в BoxSizer. Все должно быть на панели.

Мой код:

import wx

class App(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Frame", size=(550, 300))
        panel = wx.Panel(self, -1)
        mainSizer = self.makeOuterSizer()

        # fit layout
        panel.SetSizer(mainSizer)
        mainSizer.Fit(panel)

##         mainSizer.Fit(self)
##         self.SetSizer(mainSizer)

    # ----

    def makeOuterSizer(self):

        # define sizer
        innerSizer = self.makeGrid()

        # make 
        outerSizer = wx.BoxSizer(wx.VERTICAL)
        outerSizer.Add(innerSizer, 0, wx.EXPAND|wx.CENTER|wx.ALL, 10)

        return outerSizer
    # ----

    def makeGrid(self):

        sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, ""), wx.VERTICAL)

        # make fields
        itemMonomer1_label = wx.StaticText(self, -1, "Text 1")
        self.itemMonomer1_value = wx.TextCtrl(self, -1, "", size=(100, -1))
        itemMonomer2_label = wx.StaticText(self, -1, "Text 2")
        self.itemMonomer2_value = wx.TextCtrl(self, -1, "", size=(100, -1))
        itemMonomer3_label = wx.StaticText(self, -1, "Text 3")
        self.itemMonomer3_value = wx.TextCtrl(self, -1, "", size=(100, -1))

        # pack elements

        grid = wx.GridBagSizer(2, 3)

        grid.Add(itemMonomer1_label, (0,0), flag=wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL)
        grid.Add(self.itemMonomer1_value, (1,0), flag=wx.EXPAND)
        grid.Add(itemMonomer2_label, (0,1), flag=wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL)
        grid.Add(self.itemMonomer2_value, (1,1), flag=wx.EXPAND)
        grid.Add(itemMonomer3_label, (0,2), flag=wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL)
        grid.Add(self.itemMonomer3_value, (1,2), flag=wx.EXPAND)

        sizer.Add(grid, 0, wx.EXPAND|wx.ALIGN_CENTER|wx.ALL, 5)

        return sizer
    # ----

if __name__ == '__main__':
    app = wx.App()
    App().Show(True)
    app.MainLoop()

Итак, приведенный выше код на самом деле не работает. Однако, когда я заключаю в кавычки строки 10 и 11 и удаляем кавычки строки 13 и 14, по крайней мере, GridBagSizer отображается правильно. Поэтому я подозреваю, что что-то в моих строках SetSizer и Fit должно быть неправильным ... Но панель все еще застряла в верхнем правом углу и не работает ...

Любая подсказка очень ценится!

Спасибо, Дятел

1 Ответ

0 голосов
/ 11 июля 2011

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

class App(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Frame", size=(550, 300))
        self.panel = wx.Panel(self, -1)
        mainSizer = self.makeOuterSizer()

        # fit layout
        self.panel.SetSizer(mainSizer)
        mainSizer.Fit(self.panel)

# ...

def makeGrid(self):

    sizer = wx.StaticBoxSizer(wx.StaticBox(self.panel, -1, ""), wx.VERTICAL)

    # make fields
    itemMonomer1_label = wx.StaticText(self.panel, -1, "Text 1")
    self.itemMonomer1_value = wx.TextCtrl(self.panel, -1, "", size=(100, -1))
    itemMonomer2_label = wx.StaticText(self.panel, -1, "Text 2")
    self.itemMonomer2_value = wx.TextCtrl(self.panel, -1, "", size=(100, -1))
    itemMonomer3_label = wx.StaticText(self.panel, -1, "Text 3")
    self.itemMonomer3_value = wx.TextCtrl(self.panel, -1, "", size=(100, -1))

Вам все равно придется предоставить GridBagSizer один или несколько расширяемых столбцов, если вы хотите расширить его вместе со StaticBox.

...