2015-03-19 2 views
0

Я относительно новичок в wxPython и пытаюсь создать графический интерфейс. Идея такова: я хочу, чтобы столбцы были рядом друг с другом. Левый столбец имеет ширину 1/3 от общей ширины и содержит список кнопок, расположенных вертикально. Правый столбец имеет оставшуюся ширину 2/3 и содержит два статических текста с вертикальной структурой.wxpython nesting panels and sizers

Я попытался создать главную панель с горизонтальной коробкой, которая содержит две панели с вертикальными коробками. Все кнопки (и, вероятно, текст), похоже, сложены на одном месте.

Мой код:

wx.Frame.__init__(self, None, wx.ID_ANY, "Load coordinates", size=(600,600)) 
mainPanel = wx.Panel(self, wx.ID_ANY, size=(600,600)) 
btnPanel = wx.Panel(self, wx.ID_ANY, size=(600,300)) 
txtPanel = wx.Panel(self, wx.ID_ANY, size=(600,300)) 

# create the buttons and bindings 
btn1 = wx.Button(btnPanel, 1, label="1") 
btn2 = wx.Button(btnPanel, 2, label="2") 
btn3 = wx.Button(btnPanel, 3, label="3") 
btn4 = wx.Button(btnPanel, 4, label="4") 
btn5 = wx.Button(btnPanel, 5, label="5") 

# create static text field 
text1 = wx.StaticText(txtPanel, 6) 

# put the buttons in a sizer 
btnSizer = wx.BoxSizer(wx.VERTICAL) 
btnSizer.Add(btn1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1) 
btnSizer.Add(btn2, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1) 
btnSizer.Add(btn3, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1) 
btnSizer.Add(btn4, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1) 

# create line for visual 
btnLine = wx.StaticLine(self) 
btnSizer.Add(btnLine, 1, wx.ALL|wx.LEFT|wx.EXPAND, 20) 

# last button 
btnSizer.Add(btn5, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1) 

# put text in a sizer 
txtSizer = wx.BoxSizer(wx.VERTICAL) 
txtSizer.Add(text1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1) 

btnPanel.SetSizer(btnSizer) 
txtPanel.SetSizer(txtSizer) 

# add panels to main panel 
mainSizer = wx.BoxSizer(wx.HORIZONTAL) 
mainSizer.Add(btnPanel, 1, wx.EXPAND, 5) 
mainSizer.Add(txtPanel, 1, wx.EXPAND, 5) 
mainPanel.SetSizer(mainSizer) 

Кто-нибудь может понять, почему это не работает, как ожидалось?

ответ

0

Решение проблемы. Мне не нужно, чтобы сделать несколько панелей (хотя я не знаю, если это сделал разницу) и наиболее imortantly мне нужно установить Sizer к раме и не панели, а значит:

# faulty: 
mainPanel.SetSizer(mainSizer) 

# correct 
self.SetSizer(mainSizer) 
0

На самом деле вы почти всегда сделайте панель родителем ваших виджетов. Это не только обеспечивает правильный внешний вид на всех платформах, но также позволяет правильно вести вкладку через виджеты. Также вы не должны использовать свои собственные идентификаторы, особенно те, которые настолько низки. Эти идентификаторы, вероятно, зарезервированы самим wxPython и могут вызвать какое-то действительно странное поведение.

Вот пример, который показывает, как сделать то, что вы хотите (или близкий к нему):

import wx 

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

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

     main_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     btn_sizer = wx.BoxSizer(wx.VERTICAL) 
     txt_sizer = wx.BoxSizer(wx.VERTICAL) 

     for i in range(5): 
      btn = wx.Button(self, label='%s' % i) 
      btn_sizer.Add(btn, 0, wx.ALL|wx.LEFT) 

     txt = wx.TextCtrl(self, style=wx.TE_MULTILINE) 
     txt_sizer.Add(txt, 1, wx.EXPAND) 

     main_sizer.Add(btn_sizer, 1) 
     main_sizer.Add(txt_sizer, 2, wx.EXPAND) 

     self.SetSizer(main_sizer) 


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

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title='Nesting Panels') 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MainFrame() 
    app.MainLoop() 
Смежные вопросы