2011-12-20 3 views
3

Мне кажется, что следующий код должен отображать текст прямо в центре окна; то есть в центре внутренней панели. Однако это не так, и мне интересно, почему нет. Если вы запустите код, вы увидите белую панель в середине кадра, 150 пикселей на 150 пикселей. Я не хочу, чтобы эта область менялась в размерах вообще, но когда я собираюсь добавить текст (раскомментирующую переменную txt в середине фрагмента), панель неизменно сжимается, чтобы соответствовать тексту. Даже указание размера StaticText для соответствия панели не является решением, потому что текст не выравнивается по центру.wxpython: центрирующий текст внутри панели внутри sizer

import wx 

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




     self.rootPanel = wx.Panel(self) 

     innerPanel = wx.Panel(self.rootPanel,-1, size=(150,150), style=wx.ALIGN_CENTER) 
     innerPanel.SetBackgroundColour('WHITE') 
     hbox = wx.BoxSizer(wx.HORIZONTAL) 
     vbox = wx.BoxSizer(wx.VERTICAL) 

     # I want this line visible in the CENTRE of the inner panel 
     #txt = wx.StaticText(innerPanel, id=-1, label="TEXT HERE",style=wx.ALIGN_CENTER, name="") 

     hbox.Add(innerPanel, 0, wx.ALL|wx.ALIGN_CENTER) 
     vbox.Add(hbox, 1, wx.ALL|wx.ALIGN_CENTER, 5) 

     self.rootPanel.SetSizer(vbox) 
     vbox.Fit(self) 

class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, -1, 'wxBoxSizer.py') 
     frame.Show(True) 
     frame.Center() 
     return True 

app = MyApp(0) 
app.MainLoop() 

ответ

6

Вам просто нужно добавить пару прокладок, чтобы заставить его работать.

import wx 

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

     self.rootPanel = wx.Panel(self) 

     innerPanel = wx.Panel(self.rootPanel,-1, size=(150,150), style=wx.ALIGN_CENTER) 
     innerPanel.SetBackgroundColour('WHITE') 
     hbox = wx.BoxSizer(wx.HORIZONTAL) 
     vbox = wx.BoxSizer(wx.VERTICAL) 
     innerBox = wx.BoxSizer(wx.VERTICAL) 

     # I want this line visible in the CENTRE of the inner panel 
     txt = wx.StaticText(innerPanel, id=-1, label="TEXT HERE",style=wx.ALIGN_CENTER, name="") 
     innerBox.AddSpacer((150,75)) 
     innerBox.Add(txt, 0, wx.CENTER) 
     innerBox.AddSpacer((150,75)) 
     innerPanel.SetSizer(innerBox) 

     hbox.Add(innerPanel, 0, wx.ALL|wx.ALIGN_CENTER) 
     vbox.Add(hbox, 1, wx.ALL|wx.ALIGN_CENTER, 5) 

     self.rootPanel.SetSizer(vbox) 
     vbox.Fit(self) 

class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, -1, 'wxBoxSizer.py') 
     frame.Show(True) 
     frame.Center() 
     return True 

app = MyApp(0) 
app.MainLoop() 
+0

Спасибо, Майк. Я потратил годы, пытаясь сделать это, спейсерный подход работает отлично. Невозможно понять, однако, что должен быть один лайнер, чтобы сделать что-то в качестве вездесущего. –

+0

Ну, вы можете создать прокладки, а затем использовать метод AddMany() sizer для добавления всех трех. Может быть, обертка, о которой я забываю, или, может быть, SizedControls будет работать. Однако я не использовал последний. –

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