wxPython: Как исправить размер одной части грид-сайзер

#python #wxpython #sizer

#python #wxpython #размер

Вопрос:

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

То, что я сделал здесь, используется wxGlade для создания фрейма с размером сетки, который имеет 1 строку и три столбца. Я хочу, чтобы часть 1 имела фиксированную ширину ‘A’, часть 2 имела фиксированную ширину ‘B’ и часть 3 могла расширяться как обычно.

Как мне это сделать?

 #!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade 0.6.3 on Tue May 24 11:35:21 2011

import wx

# begin wxGlade: extracode
# end wxGlade



class MyFrame1(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame1.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel_1 = wx.Panel(self, -1)
        self.sizer_10_staticbox = wx.StaticBox(self.panel_1, -1, "Part2")
        self.sizer_11_staticbox = wx.StaticBox(self.panel_1, -1, "Part3")
        self.sizer_9_staticbox = wx.StaticBox(self.panel_1, -1, "Part1")

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame1.__set_properties
        self.SetTitle("frame_2")
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame1.__do_layout
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_4 = wx.GridSizer(1, 3, 0, 0)
        sizer_11 = wx.StaticBoxSizer(self.sizer_11_staticbox, wx.HORIZONTAL)
        sizer_10 = wx.StaticBoxSizer(self.sizer_10_staticbox, wx.HORIZONTAL)
        sizer_9 = wx.StaticBoxSizer(self.sizer_9_staticbox, wx.HORIZONTAL)
        grid_sizer_4.Add(sizer_9, 1, wx.EXPAND, 0)
        grid_sizer_4.Add(sizer_10, 1, wx.EXPAND, 0)
        grid_sizer_4.Add(sizer_11, 1, wx.EXPAND, 0)
        self.panel_1.SetSizer(grid_sizer_4)
        sizer_8.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_8)
        sizer_8.Fit(self)
        self.Layout()
        # end wxGlade

# end of class MyFrame1


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_2 = MyFrame1(None, -1, "")
    app.SetTopWindow(frame_2)
    frame_2.Show()
    app.MainLoop()
  

Комментарии:

1. Соглашения об именовании wxGlade вызывают у меня отвращение. self.sizer_11_staticbox ? В больших проектах становится практически невозможно определить, что вообще происходит в некоторых функциях макета.

Ответ №1:

Если вы используете GridSizer, я бы, вероятно, посоветовал вам вместо этого взглянуть на GridBagSizer.

Как только вы решите, будет ли это использоваться, вам, вероятно, нужно изучить методы sizer.AddGrowableRow(row) и sizer.AddGrowableCol(col) . Они позволяют указывать столбцы или строки в сетке, которые расширяются. Они не используют пропорции использования, с которыми вы знакомы по BoxSizers (поэтому, если два столбца растут, они оба растут с одинаковой скоростью), но вы можете установить некоторые, которые расширяются, а другие — нет.

Индексы основаны на нуле, поэтому по вашему описанию я бы предположил что-то вроде gridbagsizer_4.AddGrowableCol(2) , но, как говорится в моем комментарии, соглашения об именовании wxGlade вызывают у меня недомогание, и трудно сказать наверняка, и эти методы не будут доступны в GridSizer.

Для любых заинтересованных сторон здесь доступен пост, посвященный моим классам построения форм и диалоговых окон форм: Form Builder. Было проще опубликовать это на моем сайте, куда я мог бы включить вложения, чем пытаться вставить все это сюда.

Комментарии:

1. Я проверю это, никогда не слышал о GridBagSizer …. и ваше право, мне не нравятся соглашения об именовании wxGlades — но как инструмент для быстрого макетирования графического интерфейса мне нравится это больше всего, имея в виду BoaConstructor.

2. Для быстрого инструмента это нормально, но если вам нужно настроить позже, это становится головной болью. В итоге я запустил свой собственный генератор форм и классы диалоговых окон форм, которые принимают структурированный объект и преобразуют его в полную форму. Это автоматизирует создание и размещение размера, что является огромным плюсом в моей книге. Я был бы готов сделать вам копию, если вам интересно. Также вы можете взглянуть на XRCed — он похож на wxGlade, но использует структуру XML, с которой не страшно работать.

3. Сейчас я пытаюсь XRCed, но, похоже, не могу заставить GridBagSizer работать правильно. Не могли бы вы смоделировать пример того, как должна выглядеть моя проблема сверху? Я могу создать GridBagSizer, но когда я пытаюсь добавить к нему статический размер, он выдает ошибку. Также пробовал FlexGridSizer, но пока мне не удалось правильно установить минимальные / максимальные размеры.

4. Может ли сайзер иметь минимальный размер? В качестве теста я создал wxStaticBox и смог принудительно установить минимальный размер. Затем я создал wxStaticBoxSizer и использовал ту же опцию, и использование wxFixed_MINSIZE не дало никакого эффекта

5. Насколько я понимаю, сайзер должен определять свой собственный минимальный размер. Итак, я думаю, что мне нужно сделать, это иметь возможность определять максимальный размер одного столбца. GridBag и FlexGrid «должны» иметь возможность делать это, устанавливая для определенных столбцов значение увеличения, а для других — статический размер. Но пока мне не удалось заставить его полностью работать