【问题标题】:boxsizers not displaying correctly WX.PYTHONboxsizers 没有正确显示 WX.PYTHON
【发布时间】:2019-04-29 17:33:36
【问题描述】:

所以我的方法是创建一个 wx.notebook,每个标签显示我的 25 张图像。我试图把我的图像和一个标题放在独立的盒子尺寸器中,然后将这些独立的 5 个放在水平盒子尺寸器中(每个标签有 5 个水平尺寸器。)。所以每个水平尺寸器需要 5 个垂直尺寸器(5 * 5 = 25)。然后我将这 5 个水平尺寸器放在一个垂直尺寸器中,这样我就得到了 5X5 的网格外观。它正确加载并且我知道图像存储正确但是当我显示它们时它只显示每行中的一个图像。我不知道我做错了什么。这是代码

    listOfSizers = []
    listofHSizers = []
    listofVsizers = []

    bSizer6 = wx.BoxSizer( wx.HORIZONTAL )
    bSizer14 = wx.BoxSizer( wx.HORIZONTAL )
    self.waferTab = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition,size = wx.Size( 900,1000 ) , style = wx.NB_TOP)

    for i in range(waferNum):
        temp = wx.BoxSizer(wx.VERTICAL)
        listOfSizers.append(temp)
    for i in range(numOfTabs*5):
        temp = wx.BoxSizer(wx.HORIZONTAL)
        listofHSizers.append(temp) 
    for i in range(numOfTabs):
        temp = wx.BoxSizer(wx.VERTICAL)
        listofVsizers.append(temp)


    for tab in range(numOfTabs):

            tempPanel = wx.Panel(self.waferTab,wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )

            listOfPanels.append(tempPanel)

    waferDesign = WaferInfo(die_size = (.2,.35),center_xy= (10 ,6.5), dia= 4.3 , edge_excl= 0.0 )

    for i in range(waferNum):
        temp = wm_core.WaferMapPanel(listOfPanels[i//25], xydList[i], waferDesign, data_type='discrete'.lower() , show_die_gridlines= False )
        boxText = wx.StaticText( listOfPanels[i//25], wx.ID_ANY, mapTitles[i][0], wx.DefaultPosition, wx.DefaultSize, 0 )
        boxText.Wrap(-1)
        listOfSizers[i].Add(boxText, 0 , wx.ALIGN_CENTER , 5)
        listOfSizers[i].Add(temp, 1, wx.EXPAND |wx.ALL, 5 )

    currentHSizer = 0 
    nextHSizer = 0 
    currentSizer = 0 
    nextSizer = 0

    for i in range(waferNum ):
        if(nextHSizer != 4):
            listofHSizers[currentHSizer].Add(listOfSizers[i], 0 , wx.ALIGN_CENTER, 3)
            nextHSizer +=1
        elif(nextHSizer == 4):
            listofHSizers[currentHSizer].Add(listOfSizers[i], 0 , wx.ALIGN_CENTER, 3)
            currentHSizer += 1
            nextHSizer = 0


    for i in range(len(listofHSizers)):
        if(nextSizer !=4):
            listofVsizers[currentSizer].Add(listofHSizers[i],0, wx.ALIGN_LEFT,5)
            nextSizer +=1
        elif(nextSizer == 4):
            listofVsizers[currentSizer].Add(listofHSizers[i],0, wx.ALIGN_LEFT, 5)
            currentSizer +=1
            nextSizer = 0
    print(len(listOfSizers))
    print(len(listofHSizers))
    print(len(listofVsizers))

    for tab in range(numOfTabs):
        tabString = ("Page"+ str(self.tabNumber))    
        listOfPanels[tab].SetSizer(listofVsizers[tab])
        listOfPanels[tab].Layout()
        listofVsizers[tab].Fit( listOfPanels[tab] )
        self.waferTab.AddPage(listOfPanels[tab], tabString, select=False)
        self.tabNumber += 1

    bSizer6.Add(self.waferTab ,1, wx.EXPAND |wx.ALL, 5)
    bSizer6.Add( bSizer14, 0, wx.EXPAND, 5 )
    self.SetSizer(bSizer6 )
    self.Layout()
    #self.Centre( wx.BOTH )

输出看起来像这样

每行假设有 5 个,但它只有一个。关于为什么这可能会有所帮助的任何想法都会有所帮助。我也知道我可以使用网格来使它更容易,但由于限制,我不允许使用网格。

【问题讨论】:

  • 图片有多大?即,如果您在画笔/gimp 中打开它,报告的尺寸是多少?此外,布局的处理方式与 XML 一样。因此,如果您需要添加一些东西,您应该这样做:horSizer1->Add( panel ); mainSizer->Add( horSizer );,而且您的代码有点难以理解。
  • 作为一个例子 - 为什么你需要将sizer存储在数组中?您打算显示/隐藏它们吗?最后,为什么不能使用网格尺寸器?
  • 你也应该考虑使用 RAD 工具——比如 wxGlade 可以为你生成 Python 代码。
  • 我使用 wx.formbuilder,它在工具上显示良好,但在实际脚本中显示不正确,尺寸肯定不是问题,尺寸调整器只是让我知道为这些图纸中的每一个分配什么标题.我认为这可能与我展示它们的方式有关。 wx.expand
  • 只是好奇:什么可能的限制可能会阻止您使用wxGridSizerwxFlexGridSizer,同时允许您使用wxBoxSizer

标签: python python-3.x wxwidgets wxpython


【解决方案1】:

您将所有项目的 比例参数(第二个在 wxSizer.Add(..., p, ...))设置为 0。因此,由于wx.ALIGN_CENTER 标志,没有布局,所有项目都到同一个地方,中心。

为一个sizer的所有sub-sizer设置一个比例= 1的值,使得分配的空间在sub-sizer之间均匀分布。不同的比例按比例共享每个 sub-sizer 的空间。

另外,listOfPanels[tab].SetSizer(listofVsizers[tab]) 为每个页面设置一个垂直大小。 tab 索引在 [0, numOfTabs-1] 范围内。因此,您需要在填写listofVsizers之前重置currentSizer

或者...您希望(为什么?)将所有主要的大小调整器放在一个数组中。那么数组的大小是 5*numOfTabs(不仅仅是 numOfTabs)。这意味着您必须调整索引而不仅仅是tab,然后不要重置currentSizer

你看,有一些令人困惑的代码。您应该使用调试器来查看您使用的索引的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多