【问题标题】:How do I properly include a wx.grid inside a wx.GridBagSizer?如何在 wx.GridBagSizer 中正确包含 wx.grid?
【发布时间】:2019-05-27 06:50:01
【问题描述】:

我刚刚开始学习 python 和 wxpython 小部件的使用。我尝试创建一个 50 X 3 wx.grid。如果它是面板中唯一的对象,那么没有问题。但是,如果我尝试使用 GridBagSizer 包含其他对象,那么即使我为 5 行 3 列指定了 span=(5,3),它似乎也只占用了 sizer 的一个单元格。

我尝试为包含网格(在我的代码中注释)的面板使用单独的 BoxSizer,但它也不起作用。

import wx
import wx.grid

class Screen(wx.Frame):
    def __init__(self, parent, title):
        super(Screen, self).__init__(parent, title=title,
            size=(500, 500))
                self.paneltab = wx.Panel(self.panel)
        self.paneltab.SetSize(size=(150,150))

        #this is the grid I want to display properly
        self.tab = wx.grid.Grid(self.paneltab)

        self.tab.CreateGrid(50,3)
        self.tab.SetColSize(0,150)
        self.tab.SetColSize(1,100)
        self.tab.SetColSize(2,50)
        self.tab.SetColLabelValue(0, "USER")
        self.tab.SetColLabelValue(1, "Log-In Time")
        self.tab.SetColLabelValue(2, "Status")
        self.SetLayout()
        self.Centre()

    def SetLayout(self):
        sizer = wx.GridBagSizer(0,0)
        #sizertab = wx.BoxSizer(wx.VERTICAL)
        #self.paneltab.SetSizer(sizerTab)


        sizer.Add((100,-1),     pos=(0,0))
        sizer.Add((100,-1),     pos=(0,1))
        sizer.Add((100,-1),     pos=(0,2))
        text1 = wx.StaticText(self.panel, label='Hello', style = 
            wx.ALIGN_CENTER)
        text2 = wx.StaticText(self.panel, label='World', style = 
            wx.ALIGN_CENTER)

        sizer.Add(text1,   pos=(1,0),  span=(1,1), flag=wx.TOP|wx.EXPAND,  
            border=5)
        sizer.Add(text2,   pos=(1,2),  span=(1,2), flag=wx.TOP|wx.EXPAND,  
            border=5)

        #sizer.Add(sizertab,     pos=(2,1),  span=(5,2), 
            flag=wx.TOP|wx.EXPAND,  border=5)
        sizer.Add(self.paneltab,     pos=(2,0),  span=(5,3), 
            flag=wx.TOP|wx.EXPAND,  border=5)

        self.panel.SetSizer(sizer)
        sizer.Fit(self)
        self.panel.SetBackgroundColour("thristle1")

def main():
    app = wx.App()                            
    screen = Screen(None, title='Server Consule')
    screen.Show()  
    app.MainLoop()
if __name__ == '__main__':
    main()

我希望网格显示在 span=(5,3) 中,但它似乎显示在 span=(1,1) 中。

【问题讨论】:

  • 有些人可能会质疑试图将 50x3 网格塞入 gridbagsizer 中的一个小槽的原因!

标签: wxpython wxwidgets


【解决方案1】:

我认为您在代码中错过了这一点:

    self.panel = wx.Panel(self)

例如,让您的 StaticText “使用”整个空间,可以这样尝试:

    sizer.Add(text1,(1,0),(1,1),1,wx.TOP|wx.EXPAND,5)
    sizer.Add(text2,(1,2),(1,2),1,wx.TOP|wx.EXPAND,5)

重要的是标志前的“1”。这使他们可以使用整个空间。

【讨论】:

    【解决方案2】:

    你的意思是你想要这样的东西:

    正如我在评论中所说,它看起来有点奇怪。使用多个BoxSizer 可能会更好。
    您修改后生成上述代码的代码是:

    import wx
    import wx.grid
    
    class Screen(wx.Frame):
        def __init__(self, parent, title):
            super(Screen, self).__init__(parent, title=title, size=(500, 500))
    
            self.paneltab = wx.Panel(self)
            self.paneltab.SetSize((500,250))
            #this is the grid I want to display properly
            self.tab = wx.grid.Grid(self.paneltab)
            self.tab.CreateGrid(50,3)
            self.tab.SetColSize(0,150)
            self.tab.SetColSize(1,100)
            self.tab.SetColSize(2,50)
            self.tab.SetColLabelValue(0, "USER")
            self.tab.SetColLabelValue(1, "Log-In Time")
            self.tab.SetColLabelValue(2, "Status")
    
            self.tab.SetMinSize((300,300))
    
            self.text1 = wx.StaticText(self.paneltab, label='Hello', style = wx.ALIGN_CENTER)
            self.text2 = wx.StaticText(self.paneltab, label='World', style = wx.ALIGN_CENTER)
    
            self.SetLayout()
            self.Centre()
    
        def SetLayout(self):
            sizer = wx.GridBagSizer(5,5)
            sizer.Add((100,-1),     pos=(0,0))
            sizer.Add((100,-1),     pos=(0,1))
            sizer.Add((100,-1),     pos=(0,2))
            sizer.Add(self.text1,   pos=(1,0), span=(1,1), flag=wx.TOP|wx.EXPAND, border=5)
            sizer.Add(self.text2,   pos=(1,2), span=(1,2), flag=wx.TOP|wx.EXPAND, border=5)
            sizer.Add(self.tab,     pos=(2,3), span=(3,5), flag=wx.TOP|wx.EXPAND, border=5)
            self.paneltab.SetSizer(sizer)
            self.paneltab.SetBackgroundColour("#D8BFD8")
    
    def main():
        app = wx.App()
        screen = Screen(None, title='Server Console')
        screen.Show()
        app.MainLoop()
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2017-10-27
      • 2019-07-25
      • 1970-01-01
      • 2021-01-27
      相关资源
      最近更新 更多