2016-03-28 2 views
0

Я просто написал небольшой код, который должен поместить некоторый TextCtrl в ScrolledPanel ... Код Работает, если вы сохраняете переменные слова в диапазоне до 1440, если вы поместите больше макета, как панели будут стеки друг на друга ... Тогда, если они складываются, и вы нажимаете кнопку добавления виджета, все вернется к норме ... Я не понимаю этого поведения, может кто-нибудь зажечь мою свечу? : РwxBoxSizer и wxScrolledPanel Layout

<code># -*- coding: cp1252 -*- 

import wx 
import wx.lib.scrolledpanel as scrolled #Sinon ça ne marche pas... 
class MyForm(wx.Frame): 



#---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(200,500)) 

     # Add a panel so it looks the correct on all platforms 
     self.panel = wx.Panel(self, wx.ID_ANY) 

     #Controls 
     self.scrolled_panel = scrolled.ScrolledPanel(self.panel, -1, 
           style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1") 
     self.scrolled_panel.SetupScrolling() 

     #Layout 
     #-- Scrolled Window 
     self.spSizer = wx.BoxSizer(wx.VERTICAL) 
     words=range(0,2000)# Works nice untill around 1430 then layout is incorrect... 
     for word in words: 
      text = wx.TextCtrl(self.scrolled_panel, value=str(word)) 
      self.spSizer.Add(text) 
     self.scrolled_panel.SetSizer(self.spSizer) 
     self.spSizer.Fit(self.scrolled_panel) 

     #bouton 
     btn = wx.Button(self.panel, label="Add Widget") 
     btn.Bind(wx.EVT_BUTTON, self.onAdd) 
     #Panel 
     panelSizer = wx.BoxSizer(wx.VERTICAL) 
     panelSizer.AddSpacer(50) 
     panelSizer.Add(self.scrolled_panel, 1, wx.EXPAND) 
     panelSizer.Add(btn) 
     self.panel.SetSizer(panelSizer) 
     panelSizer.Fit(self.panel) 
     panelSizer.Layout() 

     # -------------------- 
     # Scrolled panel stuff 

     self.scrolled_panel.SetAutoLayout(1) 


    #---------------------------------------------------------------------- 
    def onAdd(self, event): 
     """""" 
     print "in onAdd" 
     new_text = wx.TextCtrl(self.scrolled_panel, value="New Text") 
     self.spSizer.Add(new_text) 
     self.scrolled_panel.Layout() 
     self.scrolled_panel.SetupScrolling() 
     event.Skip() 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm().Show() 
    app.MainLoop() 

ответ

1

Это действительно не очень хорошая идея, чтобы создать тысячи текстовых элементов управления, вы почти наверняка работаете в какой-то Windows, (я пойду на конечности и считать, что это то, что вы используете, даже если вы этого не говорите). Вероятнее всего, это ограничение ~ 32000 на координаты окон, но даже если вы можете избежать этого, у вас все равно будет нехватка ресурсов GDI, если вы создали 10000 из них.

Так что ответ в основном: не делайте этого. Вы должны использовать что-то вроде wxListCtrl, wxDataViewCtrl или wxGrid, чтобы отображать данные и разрешать их редактирование по требованию, то есть только создавая одиночныйwxTextCtrl, когда это необходимо.

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

  • Нет связанных вопросов^_^