2015-09-27 2 views
2

Я пытаюсь создать панель управления в WX form builder для Python. У меня возникли проблемы с попыткой выяснить, как сохранить два горизонтальных sizer, которые являются дочерними элементами, к вертикальному sizer от расширения далеко друг от друга. Ниже описывающий снимок экрана, что я имею в виду:Как предотвратить вертикальные sizers от расширения своих детей полностью вниз в wxformbuilder

enter image description here

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

Мой первый инстинкт - это то, что связано с флагами wx.EXPAND и т. Д. Однако я не смог изменить их таким образом, чтобы заставить sizers приблизиться друг к другу. Это почти так же, как каждый раз, когда я помещаю sizer, он автоматически пытается подогнать все по всему окну ... что затрудняет размещение предметов в точном месте на форме. Любые предложения о том, как остановить sizers от расширения до всего размера окна кадра?

Следующим шагом было попытаться использовать гридизатор или сетку с гибкими сетками, однако я использовал их только по прямому коду, где вы можете выбрать точное местоположение в сетке, где вы хотите добавить виджета или объекта. С формирователем форм я обнаружил, что их сложнее использовать в основном из-за того, что я не могу вставлять объекты по определенным индексам в сетке sizer. Он вставляет их последовательно:

1,1 -> 1,2 -> 1,3 -> 1, i -> 2,1 -> 2,2 -> 2,3 -> 2, i - > j, i

Это означает, что если мне нужно что-то изменить в сетке ... Это очень сложно. Есть ли что-то, что мне не хватает, что упрощает вставку объектов в сетку, кроме как последовательно?

Ниже приведен один из примера 5х5 сетки классификатора (не полностью заполненные), где я указал как горизонтальные и вертикальные зазоры = 0:

enter image description here enter image description here

Помимо возможности заменить кнопку с текстовым полем в 1,4, я замечаю, что горизонтальный зазор явно не равен нулю, хотя я указал 0 для вертикальных и горизонтальных разрывов. Это также затрудняет разработку формы. Почему существует горизонтальный зазор между кнопками?

ответ

3

Как вы заметили, «материал» расширяется, чтобы соответствовать при использовании sizers, и флаг пропорции может нанести ущерб вашему макету, если он не используется должным образом.
Играть с этой простой фрагмент кода:

import wx 

class Summary(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Playing with Simple Sizers", size=(430,260)) 

     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.log = wx.TextCtrl(self.panel, wx.ID_ANY, value="input1:",size=(428,25)) 
     self.log2 = wx.TextCtrl(self.panel, wx.ID_ANY, value="input2:", size=(428,25)) 
     self.quit_button = wx.Button(self.panel, label="Quit",size=(60,25)) 
     self.button1= wx.Button(self.panel, label="1",) 
     self.button2 = wx.Button(self.panel, label="2",size=(60,25)) 
     self.button3 = wx.Button(self.panel, label="3",size=(60,25)) 
     self.button4 = wx.Button(self.panel, label="4",size=(60,25)) 
     self.quit_button.Bind(wx.EVT_BUTTON, self.OnQuit) 

     vbox = wx.BoxSizer(wx.VERTICAL) 
     hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox2 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox3 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox4 = wx.BoxSizer(wx.HORIZONTAL) 

     vbox.Add(self.quit_button, 0, wx.ALL|wx.EXPAND, 1) 
     hbox1.Add(self.log, 0, wx.ALL|wx.EXPAND, 1) 
     hbox2.Add(self.log2, 0, wx.ALL|wx.EXPAND, 1) 

     hbox3.Add(self.button1, 1, wx.ALL|wx.EXPAND, 1) 
     hbox3.Add(self.button2, 2, wx.ALL|wx.EXPAND, 1) 
     hbox4.Add(self.button3, 0, wx.ALL|wx.EXPAND, 1) 
     hbox4.Add(self.button4, 1, wx.ALL|wx.EXPAND, 1) 

     vbox.Add(hbox1, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1) 
     vbox.Add(hbox3, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1) 
     vbox.Add(hbox4, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1) 
     vbox.Add(hbox2, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1) 

     self.panel.SetSizer(vbox) 
     self.Show() 

    def OnQuit(self, event): 
     self.Close() 
# Run the program 
if __name__ == "__main__": 
    app = wx.App() 
    frame = Summary() 
    app.MainLoop() 

Флаг показатель является вторым параметром при добавлении в классификаторе.
Вы заметите, что для кнопок были установлены значения 0, 1 и 2, измените их и посмотрите, что происходит с кнопками по отношению друг к другу, и играйте с параметром размера кнопки.
Измените флажок пропорции на self.log или self.log2 на 1 и наблюдайте, как он расширяется.
Наконец, увеличьте размер рамки и увидите реакцию.
Сасификаторы могут быть крайне расстраивающими сначала, но как только вы «получите» это, они являются мощными инструментами.

1

Просто сделайте proportion сизара (ноль). Если пропорция больше 0, механизм компоновки пытается выделить пространство в соответствии с этим значением, в противном случае он сделает как можно меньше минимальным, что вам нужно. Большую часть времени я предпочитаю пропорцию как 0.

Я не использовал wx.GridSizer, но часто использую wx.GridBagSizer. Вам не нужно добавлять свои виджеты в wx.GridBagSizer последовательно, или вам не нужно ставить виджеты для каждой ячейки, она работает так, как вы ожидаете. Добавьте wx.GridBagSizer на свою панель в wxformbuilder и добавьте к нему свои виджеты. Вы можете изменить row, column виджета из свойств объекта под gbsizeritem, и он будет размещен соответственно после изменения.

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