【问题标题】:Having difficulty understanding wx.Sizers in wxPython难以理解 wxPython 中的 wx.Sizers
【发布时间】:2012-12-10 02:05:03
【问题描述】:

wxPython 的文档记录很差,理解 sizers 有点困难,我不得不打印出代码并逐段研究它以了解它的作用,以及更容易记住它的工作原理的方法。

鉴于我来自网络背景,我倾向于将 sizers 与 xhtml div 标签进行比较,我将 css、flags 和 wxpython 中没有的东西进行比较,但看到 div 和 css 的间距非常好等等,跟上 wxpython 中的所有内容有点困难,但我想时间会证明一切。

在这里,我正在尝试创建一个带有面板的简单框架,以及一个带有标签和十像素边框的静态框,以及几个静态文本和一些文本控件。 (wx.TextCtrl)

这就是我的目标。

我想代码不会太多,但是加上父母和标志的数量等等,它只会让人感到困惑。

我怎样才能添加一个带填充的静态框,这样它就不会接触面板的两侧(边框),我怎么知道我应该使用什么尺寸?

【问题讨论】:

    标签: python python-2.7 wxpython pywin32


    【解决方案1】:

    这是一个更易于维护的起点。

    import wx
    
    class PersonalInfoDialog(wx.Dialog):
        def __init__(self, parent):
            super(PersonalInfoDialog, self).__init__(parent)
            self.SetTitle('Personal Info')
            sizer = self.create_controls()
            self.SetSizer(sizer)
        def create_controls(self):
            box = self.create_box()
            buttons = self.create_buttons()
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(box, 1, wx.EXPAND | wx.ALL, 10)
            sizer.Add(buttons, 0, wx.EXPAND | wx.BOTTOM, 10)
            return sizer
        def create_box(self):
            contents = self.create_box_contents()
            box = wx.StaticBox(self, -1, 'Personal Info')
            sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
            sizer.Add(contents, 1, wx.EXPAND | wx.ALL, 10)
            return sizer
        def create_box_contents(self):
            male = wx.CheckBox(self, -1, 'Male')
            married = wx.CheckBox(self, -1, 'Married')
            age = self.create_age()
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(male)
            sizer.AddSpacer(10)
            sizer.Add(married)
            sizer.AddSpacer(10)
            sizer.Add(age)
            return sizer
        def create_age(self):
            age = wx.SpinCtrl(self, -1, '28', min=0, max=100, size=(64, -1))
            sizer = wx.BoxSizer(wx.HORIZONTAL)
            text = wx.StaticText(self, -1, 'Age')
            sizer.Add(text, 0, wx.ALIGN_CENTER_VERTICAL)
            sizer.AddSpacer(10)
            sizer.Add(age)
            return sizer
        def create_buttons(self):
            button = wx.Button(self, wx.ID_OK, 'OK')
            sizer = wx.BoxSizer(wx.HORIZONTAL)
            sizer.AddStretchSpacer(1)
            sizer.Add(button)
            sizer.AddStretchSpacer(1)
            return sizer
    
    def main():
        app = wx.App(False)
        dialog = PersonalInfoDialog(None)
        dialog.ShowModal()
        dialog.Destroy()
        app.MainLoop()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案2】:

      这将创建你想要的基本.. 可能需要一些小的修改..

      import wx
      a = wx.App(redirect=False)
      f = wx.Frame(None,-1,"application")
      p = wx.Panel(f,-1)
      sb = wx.StaticBox(p,-1,"label")
      sb_sz = wx.StaticBoxSizer(sb,wx.VERTICAL)
      sb_sz.Add(wx.CheckBox(p,-1,"CB 1",size=(200,-1)),0,wx.ALL,10)
      sb_sz.Add(wx.CheckBox(p,-1,"CB 2"),0,wx.ALL,10)
      sb_sz.AddSpacer(7)
      sz_h = wx.BoxSizer(wx.HORIZONTAL)
      sz_h.Add(wx.StaticText(p,-1,"Some Label"),0,wx.ALL,10)
      sz_h.Add(wx.Choice(p,-1,choices = ["A","B","C"]))
      sb_sz.Add(sz_h)
      sb_sz.AddSpacer(35)
      sz = wx.BoxSizer(wx.VERTICAL)
      sz.Add(sb_sz,0,wx.ALL,10)
      p.SetSizer(sz)
      sz_h2 = wx.BoxSizer(wx.HORIZONTAL)
      sz_h2.Add(wx.Button(p,wx.ID_OK))
      sz_h2.Add(wx.Button(p,wx.ID_CANCEL))
      sz.Add(sz_h2,0,wx.ALIGN_RIGHT|wx.ALL,10)
      sz2 = wx.BoxSizer()
      f.SetSizer(sz2)
      sz2.Add(p)
      f.Layout()
      f.Fit()
      f.Show()
      a.MainLoop()
      

      【讨论】:

      • 感谢您的意见,我做了一些修改,我应该能够更好地了解正在发生的事情。
      猜你喜欢
      • 1970-01-01
      • 2014-07-12
      • 2017-06-22
      • 2010-10-28
      • 2014-11-15
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多