2012-06-08 2 views
1

Я пытаюсь вставить сизер с горизонтальной компоновкой внутри вертикальной компоновщика макета панели notebookPage.Проблема с wxpython boxsizer с помощью wxnotebook

Я получил некоторое вдохновение от wxPython: Resizing a notebook within a notebook, но не могу заставить его работать должным образом.

Вместо того, чтобы этот макет

Тоннаж предел (в тоннах): [3000]
[х] Включить фильтр на паросочетания категории

Все подогнаны на одной линии в панель

Я бегу это на Win7, питон 2.6.6 WX 2.8.12.1

Вот соответствующий код:

import sys 
import os 


import wx 

class MainWindow(wx.Frame): 
    def __init__(self,parent,title): 
     self.ID_LOAD=101 
     self.ID_SAVE=102 

     # based on a frame, so set up the frame 
     wx.Frame.__init__(self,parent,wx.ID_ANY, title, size=(640,480)) 

     self.CreateStatusBar() 

     self.tab = wx.Notebook(self, -1, style=(wx.NB_TOP)) 
     self.globPanel = wx.NotebookPage(self.tab, -1) 
     self.orderPanel = wx.NotebookPage(self.tab, -1) 
     self.slabsPanel = wx.NotebookPage(self.tab, -1) 
     self.tab.AddPage(self.globPanel, "Global filter") 
     self.tab.AddPage(self.orderPanel, "Orders filter") 
     self.tab.AddPage(self.slabsPanel, "Slabs filter") 

     self.toolbar = wx.ToolBar(self, wx.ID_ANY, style=wx.TB_HORIZONTAL) 
     self.toolbar.SetToolBitmapSize((20,20)) 
     load_ico = wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, (20,20)) 
     self.toolbar.AddLabelTool(self.ID_LOAD, "Load", load_ico, bmpDisabled=wx.NullBitmap, shortHelp='Load', longHelp="Loads a text file to the filter editor") 
     save_ico = wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR, (20,20)) 
     self.toolbar.AddLabelTool(self.ID_SAVE, "Save", save_ico, bmpDisabled=wx.NullBitmap, shortHelp='Save', longHelp="Saves the contents of the filter editor") 
     self.toolbar.AddSeparator() 

     self.tonnageStatic = wx.StaticText(self.globPanel, wx.ID_ANY, "Tonnage limit (in tons): ") 
     self.tonnageEdit = wx.TextCtrl(self.globPanel, wx.ID_ANY, '30000') 
     self.tonnageSizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.tonnageSizer.Add(self.tonnageStatic, flag=wx.EXPAND | wx.RIGHT | wx.LEFT | wx.TOP | wx.BOTTOM, border=10) 
     self.tonnageSizer.Add(self.tonnageEdit, flag=wx.EXPAND | wx.RIGHT | wx.LEFT | wx.TOP | wx.BOTTOM, border=10) 

     self.filterCheck = wx.CheckBox(self.globPanel, wx.ID_ANY, "Enable filter on matchings categories") 

     self.globSizer = wx.BoxSizer(wx.VERTICAL) 
     self.globSizer.Add(self.tonnageSizer) 
     self.globSizer.Add(wx.StaticLine(self), 0, wx.EXPAND) 
     self.globSizer.Add(self.filterCheck, 0, wx.EXPAND) 
     self.globPanel.SetSizer(self.globSizer) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.toolbar,0,wx.EXPAND) 
     self.sizer.Add(wx.StaticLine(self), 0, wx.EXPAND) 
     self.sizer.Add(self.tab, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 
     self.Layout() 
     self.toolbar.Realize() 

     # Show it !!! 
     self.Show(1)    

def main(): 
    app = wx.PySimpleApp() 
    view = MainWindow(None, "Input filter") 
    app.MainLoop() 

if __name__ == "__main__": 
    main() 

Это slighlty лучше, как это, но я не получаю статическую строку и отображается только первый символ метки checkox

self.tonnageStatic = wx.StaticText(self.globPanel, wx.ID_ANY, "Tonnage limit (in tons): ") 
self.tonnageEdit = wx.TextCtrl(self.globPanel, wx.ID_ANY, '30000') 
self.tonnageSizer = wx.BoxSizer(wx.HORIZONTAL) 
self.tonnageSizer.Add(self.tonnageStatic, 0, flag=wx.EXPAND|wx.ALL) 
self.tonnageSizer.Add(self.tonnageEdit, 0, flag=wx.EXPAND|wx.ALL) 

self.filterCheck = wx.CheckBox(self.globPanel, wx.ID_ANY, "Enable filter on matchings categories") 

self.globSizer = wx.BoxSizer(wx.VERTICAL) 
self.globSizer.Add(self.tonnageSizer) 
self.globSizer.Add(wx.StaticLine(self.globPanel), 0, wx.EXPAND) 
self.globSizer.Add(self.filterCheck, 0, wx.EXPAND) 
self.globPanel.SetSizer(self.globSizer) 

self.sizer = wx.BoxSizer(wx.VERTICAL) 
self.sizer.Add(self.toolbar,0,wx.EXPAND) 
self.sizer.Add(wx.StaticLine(self), 0, wx.EXPAND) 
self.sizer.Add(self.tab, 1, wx.EXPAND) 
self.SetSizer(self.sizer) 
self.globPanel.Layout() 
self.Layout() 
self.toolbar.Realize() 

# Show it !!! 
self.Show(1) 
+0

В отличие от статической линии, отображающей не то место, которое, по моему мнению, является проблемой с размером ноутбуков в mac, эти два элемента показывают друг над другом. Похоже, что его отображение обычно для меня OSX 10.7 py2.7 wx2.8.12.1 http://bit.ly/Ko1ZVI – GP89

+0

Я запускаю это на Win7, python 2.6.6, wx 2.8.12.1 –

ответ

1

Я просто побежал это на окнах и, если вы звоните .Layout() на globPanel после self.Layout() линии он должен пнуть классификаторов в форму :)

также вы можете использовать wx.ALL, который так же, как право, LEF t, верхняя и нижняя

EDIT: Мне было любопытно, почему странное поведение и немного изменилось. Я посмотрел на места, где я использовал ноутбуки, и я всегда использую панели для страниц. Если вы меняете NotebookPages на панели, вы можете покончить с звонками Layout, и он работает так, как ожидалось.

+0

Я немного поправил код, бит все еще есть проблемы –

+1

проверить мои изменения, это помогает? – GP89

+1

На самом деле, он решает мою проблему, спасибо большое –