wxPython. 创建一个包含四个固定大小框的面板

1 投票
1 回答
2807 浏览
提问于 2025-04-15 16:18

我正在尝试创建一个面板,里面有四个框,每个框里包含一些数据。这四个框的大小应该是固定的,不会改变。目前我做的四个框有些重叠在一起。

有没有什么好的建议?

代码:

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.pl = wx.Panel(self)
        self.SetSize((500, 350))

        sb = wx.StaticBox(self.pl, -1, 'BOX0', size=(180, 150))
        sat = wx.CheckBox(self.pl, -1, 'Satellite')
        gsm = wx.CheckBox(self.pl, -1, 'GSM')
        wlan = wx.CheckBox(self.pl, -1, 'WLAN')

        sb2 = wx.StaticBox(self.pl, -1, 'BOX1', size=(180, 150))
        nm2 = wx.StaticText(self.pl, -1, 'default1')

        sb3 = wx.StaticBox(self.pl, -1, 'BOX2', size=(180, 150))
        nm3 = wx.StaticText(self.pl, -1, 'default2')

        sb4 = wx.StaticBox(self.pl, -1, 'BOX3', size=(180, 150))
        nm4 = wx.StaticText(self.pl, -1, 'default3')

        box = wx.StaticBoxSizer(sb, wx.VERTICAL)
        box.Add(sat, 0, wx.ALL, 5)
        box.Add(gsm, 0, wx.ALL, 5)
        box.Add(wlan, 0, wx.ALL, 5)

        box2 = wx.StaticBoxSizer(sb2)
        box2.Add(nm2, 0, wx.ALL, 5)

        box3 = wx.StaticBoxSizer(sb3)
        box3.Add(nm3, 0, wx.ALL, 5)

        box4 = wx.StaticBoxSizer(sb4)
        box4.Add(nm4, 0, wx.ALL, 5)

        gs = wx.BoxSizer(wx.HORIZONTAL)
        gs.Add(box)
        gs.Add(box2)

        gss = wx.BoxSizer(wx.HORIZONTAL)
        gss.Add(box3)
        gss.Add(box4)

        gt = wx.BoxSizer(wx.VERTICAL)
        gt.Add(gs)
        gt.Add(gss)

        self.pl.SetSizer(gt)

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, '08_gridsizer.py')
        frame.Show()
        self.SetTopWindow(frame)
        return 1

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

1 个回答

1

我来回答我自己的问题。

解决办法是给每个 wx.StaticBoxSizer() 加上 wx.Sizer.SetMinSize(),像这样。

sb = wx.StaticBox(self.pl, -1, 'BOX0')
sat = wx.CheckBox(self.pl, -1, 'Satellite')
gsm = wx.CheckBox(self.pl, -1, 'GSM')
wlan = wx.CheckBox(self.pl, -1, 'WLAN')

box = wx.StaticBoxSizer(sb, wx.VERTICAL)
box.SetMinSize((180, 150))
box.Add(sat, 0, wx.ALL, 5)
box.Add(gsm, 0, wx.ALL, 5)
box.Add(wlan, 0, wx.ALL, 5)

另外,我把 wx.StaticText() 中的大小参数去掉了。

撰写回答