如何在wx.GridBagSizer中正确包含wx.grid?

时间:2019-05-27 06:50:01

标签: wxpython wxwidgets

我刚刚开始学习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)。

2 个答案:

答案 0 :(得分:0)

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

    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”。这使他们占用了整个空间。

答案 1 :(得分:0)

您的意思是您想要这样的东西: enter image description here

正如我在评论中所说,它看起来有些奇怪。仅使用多个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()