2013-07-31 2 views
4

У меня возникли трудности с правильной работой моих sizers в wxpython. Я пытаюсь сделать простой горизонтальный брус сверху (с текстом в нем) и два вертикальных блока ниже (с гридизаторами * слева должен быть только 2 столбца! * Внутри каждого). Я хочу, чтобы все на картинке растягивалось и приспосабливалось к моей панели (с возможностью добавления дополнений в стороны и сверху/снизу). enter image description herewxpython layout with sizers

У меня есть два основных вопроса: 1. Я не могу получить текст в горизонтальной строке, чтобы быть в середине (она идет налево) 2. Я хотел бы пространство две вертикальные окна, чтобы охватить и соответствующим образом подгоните страницу (также хотелось бы, чтобы сетки также охватывали также).

Вот мой код (с опущено некоторые части):

  self.LeagueInfoU = wx.Panel(self.LeagueInfo,-1, style=wx.BORDER_NONE) 
      self.LeagueInfoL = wx.Panel(self.LeagueInfo,-1, style=wx.BORDER_NONE) 
      self.LeagueInfoR = wx.Panel(self.LeagueInfo,-1, style=wx.BORDER_NONE) 

      vbox = wx.BoxSizer(wx.VERTICAL) 

      hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
      hbox2 = wx.BoxSizer(wx.HORIZONTAL) 

      vbox2a = wx.GridSizer(12,2,0,0) 
      vbox3a = wx.GridSizer(10,3,0,0) 
      hbox1a = wx.BoxSizer(wx.VERTICAL) 

      vbox2 = wx.BoxSizer(wx.VERTICAL) 
      vbox3 = wx.BoxSizer(wx.VERTICAL) 


      hbox1.Add(self.LeagueInfoU, 1, wx.EXPAND | wx.ALL, 3) 
      vbox2.Add(self.LeagueInfoL, 1, wx.EXPAND | wx.ALL, 3) 
      vbox3.Add(self.LeagueInfoR, 1, wx.EXPAND | wx.ALL, 3) 

      vbox2a.AddMany([this is all correct]) 
      self.LeagueInfoL.SetSizer(vbox2a) 

      vbox3a.AddMany([this is all correct]) 
      self.LeagueInfoR.SetSizer(vbox3a) 

      font = wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.BOLD) 
      self.Big_Header = wx.StaticText(self.LeagueInfoU, -1, 'Testing This') 
      self.Big_Header.SetFont(font) 

      hbox1a.Add(self.Big_Header, 0, wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL)   
      self.LeagueInfoU.SetSizer(hbox1a) 

      hbox2.Add(vbox2, 0, wx.EXPAND) 
      hbox2.Add(vbox3, 0, wx.EXPAND) 

      vbox.Add(hbox1, 0, wx.EXPAND) 
      vbox.Add(hbox2, 1, wx.EXPAND) 
      self.LeagueInfo.SetSizer(vbox) 
+1

Не могли бы вы привести пример runnable? – GP89

+0

Кстати, вам нужны только 2 коробки и 2 сетки. (сетчатые sizers в горизонтальной коробке sizer, затем текст и горизонтальный sizer в вертикальном sizer). Вероятно, вы захотите установить пропорцию 1 при добавлении гридизаторов. – GP89

+0

GP89 и Майк оба прибили его. Спасибо за помощь! – mcfly

ответ

3

Это то, что вы после этого?

enter image description here

import wx 

class Frame(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent) 

     self.panel = wx.Panel(self) 

     main_sizer = wx.BoxSizer(wx.VERTICAL) 

     # Title 
     self.centred_text = wx.StaticText(self.panel, label="Title") 
     main_sizer.Add(self.centred_text, 0, wx.ALIGN_CENTRE | wx.ALL, 3) 

     # Grids 
     content_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     grid_1 = wx.GridSizer(12, 2, 0, 0) 
     grid_1.AddMany(wx.StaticText(self.panel, label=str(i)) for i in xrange(24)) 
     content_sizer.Add(grid_1, 1, wx.EXPAND | wx.ALL, 3) 
     grid_2 = wx.GridSizer(10, 3, 0, 0) 
     grid_2.AddMany(wx.StaticText(self.panel, label=str(i)) for i in xrange(30)) 
     content_sizer.Add(grid_2, 1, wx.EXPAND | wx.ALL, 3) 

     main_sizer.Add(content_sizer, 1, wx.EXPAND) 

     self.panel.SetSizer(main_sizer) 

     self.Show() 


if __name__ == "__main__": 

    app = wx.App(False) 
    Frame(None) 
    app.MainLoop() 
1

что-то подобное ??

import wx 



class MyFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self,None,-1,"Test Stretching!!") 
     p1 = wx.Panel(self,-1,size=(500,100)) 
     p1.SetMinSize((500,100)) 
     p1.SetBackgroundColour(wx.GREEN) 

     hsz = wx.BoxSizer(wx.HORIZONTAL) 

     p2 = wx.Panel(self,-1,size=(200,400)) 
     p2.SetMinSize((200,400)) 
     p2.SetBackgroundColour(wx.RED) 

     p3 = wx.Panel(self,-1,size=(300,400)) 
     p3.SetMinSize((300,400)) 
     p3.SetBackgroundColour(wx.BLUE) 

     hsz.Add(p2,1,wx.EXPAND) 
     hsz.Add(p3,1,wx.EXPAND) 
     sz = wx.BoxSizer(wx.VERTICAL) 
     sz.Add(p1,0,wx.EXPAND) 
     sz.Add(hsz,1,wx.EXPAND) 
     self.SetSizer(sz) 
     self.Layout() 
     self.Fit() 

a = wx.App(redirect=False) 
f = MyFrame() 
f.Show() 
a.MainLoop() 
+1

FYI, я уверен, что wx.GROW - это то же самое, что и wx.EXPAND –

+0

да, я думаю, ваше право ... по какой-то причине я думал, что рост был вертикальным ростом, а расширение было горизонтальным ... –

+0

К сожалению, если вы хотите действительно, действительно что-то сосредоточило, вы должны положить его в горизонтальный сизер и поместить внутри вертикального. –

1

Вот один из способов сделать это:

import wx 

######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 

     mainSizer = wx.BoxSizer(wx.VERTICAL) 
     hSizer = wx.BoxSizer(wx.HORIZONTAL) 
     leftGridSizer = wx.GridSizer(rows=10, cols=12, vgap=5, hgap=5) 
     rightGridSizer = wx.GridSizer(rows=10, cols=3, vgap=5, hgap=5) 


     title = wx.StaticText(self, label="Main title") 

     mainSizer.Add(wx.StaticText(self), 0, wx.EXPAND) # add a "spacer" 
     mainSizer.Add(title, 0, wx.CENTER, wx.ALL, 10) 

     for row in range(1, 11): 
      for col in range(1, 13): 
       lbl = "Row%s Col%s" % (row, col) 
       leftGridSizer.Add(wx.StaticText(self, label=lbl)) 
     hSizer.Add(leftGridSizer, 0, wx.ALL, 20) 

     for row in range(1, 11): 
      for col in range(1, 4): 
       lbl = "Row%s Col%s" % (row, col) 
       rightGridSizer.Add(wx.StaticText(self, label=lbl)) 

     hSizer.Add(rightGridSizer, 0, wx.ALL, 20) 
     mainSizer.Add(hSizer) 

     self.SetSizer(mainSizer) 

######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Sizers", size=(1600,600)) 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

Чтобы узнать о охватывающих строк, я рекомендую посмотреть на демо WxPython. Я думаю, что может поддерживаться только в wx.GridBagSizer и FlexGridSizer. Однако вы можете попробовать параметр span. Кроме того, следует отметить, что wx.GROW и wx.EXPAND являются одними и теми же. Вы также можете проверить вики для получения дополнительной информации: http://wiki.wxpython.org/GridBagSizerTutorial

Смежные вопросы