【问题标题】:Layout Management with wxPython使用 wxPython 进行布局管理
【发布时间】:2014-01-08 21:02:42
【问题描述】:

This new question is build on this

我在管理 wxPython 中的布局时遇到问题。 在这个程序中,我有两个布局中的两个按钮。但无论我做什么,我都无法更改这些按钮的位置或对齐方式。这些按钮被固定为蓝色和黄色布局。

我的代码是这样的:

import wx
class myframe(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, size=(1000,700))

        self.TitlePanel = wx.Panel(self, size=(350, 400))
        self.TitlePanel.SetBackgroundColour("green")

        self.newPanel = wx.Panel(self, size=(300, 250))
        self.newPanel.SetBackgroundColour("black")
        self.newPanel.Hide()

        self.imgPanel = wx.Panel(self, size=(300, 250))
        self.imgPanel.SetBackgroundColour("red")

        self.modulePanel=wx.Panel(self, size=(350, 250))
        self.modulePanel.SetBackgroundColour("blue")

        self.TCPanel=wx.Panel(self, size=(300, 250))
        self.TCPanel.SetBackgroundColour("yellow")

        self.myGridSizer = wx.GridBagSizer(1,1)
        self.myGridSizer.SetEmptyCellSize((0, 0))
        self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND)
        self.myGridSizer.Add(self.imgPanel, pos=(0, 10), span=(4,8), flag=wx.EXPAND)
        self.myGridSizer.Add(self.modulePanel, pos=(10, 0), span=(4,8), flag=wx.EXPAND)
        self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.EXPAND)
    ############################# Add Text to 1st Panel #########################################
        self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=wx.ALIGN_LEFT,size=(300,-1))
        font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL)
        self.text1.SetFont(font)
        self.titleSizer = wx.BoxSizer()
        self.titleSizer.Add(self.text1, flag=wx.CENTER|wx.LEFT|wx.ALIGN_RIGHT,border=10)
        self.TitlePanel.SetSizer(self.titleSizer)
    #########################################################################################
    ############################### Add Buttons in 3rd Panel ################################
        self.moduleSizer = wx.BoxSizer()
        self.button1 = wx.Button(self.modulePanel, label="Show Yellow Panel",size=(200,-1),style=wx.ALIGN_RIGHT)    
        self.moduleSizer.Add(self.button1, flag=wx.CENTER|wx.EXPAND|wx.ALIGN_RIGHT,border=10)
    #########################################################################################
        self.TCSizer=wx.BoxSizer()
        self.button2 = wx.Button(self.TCPanel, label="Bring Black Panel",size=(200,-1)) 
        self.TCSizer.Add(self.button2, flag=wx.CENTER|wx.RIGHT|wx.ALIGN_RIGHT,border=10)
    #########################################################################################
        self.SetSizer(self.myGridSizer)

        self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
        self.button1.Bind(wx.EVT_BUTTON, self.showMe)
        self.button2.Bind(wx.EVT_BUTTON, self.hideMe)

    def hideMe(self, event):
        self.TCPanel.Hide()
        self.myGridSizer.Replace(self.TCPanel, self.newPanel)
        self.newPanel.Show()
        self.Layout()

    def showMe(self, event):
        self.newPanel.Hide()
        self.myGridSizer.Replace(self.newPanel, self.TCPanel)
        self.TCPanel.Show()
        self.Layout()

if __name__ == "__main__":
    app = wx.App()
    region = myframe()
    region.Show()
    app.MainLoop()

现在,如果我可以将按钮放在布局的稍微右侧,那就太好了。 有没有什么好的教程。请提出建议。

我想做的事:

  1. 蓝色面板中的按钮应位于蓝色面板的中间

  2. 黄色面板中的按钮将缩进我想要的像素。如果我希望留下 20 像素的间隙,那么按钮将放置在黄色面板中 20 像素之后。

如果这是可能的,那将是一个很大的帮助。

【问题讨论】:

  • 您能否画出并解释您希望它的外观和行为方式?我怀疑你使用你的 sizer 层次结构和类型不正确,你想要实现的目标......
  • 我已经提供了一张图纸,希望这能清除一切。
  • 我明白了。但是我不确定我是否有机会很快回答这个问题......但无论如何它会帮助其他人理解这个问题。

标签: python layout wxpython


【解决方案1】:
  1. 要让这个按钮位于中心,只需使用标志 wx.CENTER。 您还需要将此大小调整器设置为面板大小调整器。

    self.moduleSizer = wx.BoxSizer(wx.VERTICAL)
    self.button1 = wx.Button(self.modulePanel, label="Show Yellow Panel",
                             size=(200, -1))
    self.moduleSizer.Add(self.button1, flag=wx.CENTER)
    self.modulePanel.SetSizer(self.moduleSizer)
    
  2. 要让这个按钮位于左侧,缩进为 20,请使用标志 wx.Left 并将边框设置为 20。 如上所述,您还需要将此 sizer 设置为其面板。

    self.TCSizer = wx.BoxSizer(wx.VERTICAL)
    self.button2 = wx.Button(self.TCPanel, label="Bring Black Panel",
                             size=(200, -1))
    self.TCSizer.Add(self.button2, flag=wx.LEFT, border=20)
    self.TCPanel.SetSizer(self.TCSizer)
    

init 方法调用结束。

self.Layout()

让 sizer 自行更新。

【讨论】:

  • self.modulePanel.SetSizer(self.moduleSizer) 这个命令让我很开心.. 谢谢
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2012-07-12
  • 2021-06-21
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2013-06-17
相关资源
最近更新 更多