0

我刚刚写了一个小代码,应该在 ScrolledPanel 中放置一些 TextCtrl ...如果您将变量单词保持在 1440 以下的范围内,则该代码有效,如果您放置更多,则布局就像面板将相互堆叠...然后,如果它们堆叠并且您按下添加小部件按钮,一切都会恢复正常......我不明白这种行为,有人可以点燃我的蜡烛吗?:p

<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()

4

1 回答 1

1

创建数千个文本控件确实不是一个好主意,您几乎肯定会遇到一些 Windows(我会冒昧地假设这是您使用的,即使您不说也是如此)限制。最有可能的一个似乎是 Windows 坐标的 ~32000 限制,但即使您可以避免这个限制,如果您创建了 10000 个 GDI 资源,您仍然会用完 GDI 资源。

所以答案基本上是:不要这样做。您应该使用wxListCtrl,wxDataViewCtrl或之类的东西wxGrid来显示数据并允许按需编辑它,即只在需要时创建一个 wxTextCtrl

于 2016-03-28T15:42:48.513 回答