使用 wxPython 管理布局

62 阅读1分钟

在 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)

       # 添加文本到第一个面板
       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)

       # 在第三个面板中添加按钮
       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. 解决方案

为了将按钮定位在中央,只需使用 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)

为了将这个按钮定位在左侧,并向右缩进 20 像素,可以使用 wx.Left 标志并将边框设置为 20。和上面一样,还需要将此调整器设置为其面板。

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(),以使调整器更新。