2016-10-19 6 views
0

我在使用標誌放置在底部居中的2個按鈕時遇到了一些困難。輸出是這個當我嘗試了,我不明白爲什麼他們不對齊的底部中心:試圖在wxPython中使用標誌來移動按鈕構件的困難

enter image description here

用下面的代碼:

#!/usr/bin/python 

# gui.py 

import wx 
import webbrowser 

class PanelOne(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent) 

class PanelTwo(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent) 

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

     self.poo() 

    def poo(self): 
     self.CreateStatusBar() 
     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     self.add_entry = wx.MenuItem(fileMenu, -1, '&Add Entry\tShift+A', 'Add employee') 
     quit = wx.MenuItem(fileMenu, wx.ID_EXIT, '&Quit\tEsc', 'Quit application') 
     fileMenu.AppendItem(self.add_entry) 
     fileMenu.AppendItem(quit) 
     menubar.Append(fileMenu, '&Options') 
     self.SetMenuBar(menubar) 

     self.panel_one = PanelOne(self) 
     self.panel_two = PanelTwo(self) 
     self.panel_two.Hide() 

     vbox = wx.BoxSizer(wx.VERTICAL) 
     vbox.Add(self.panel_one, 1, wx.EXPAND) 
     vbox.Add(self.panel_two, 1, wx.EXPAND) 
     self.SetSizer(vbox) 

     pv1box = wx.BoxSizer(wx.HORIZONTAL) 
     self.panel_one.SetSizer(pv1box) 

     self.chrome_button = wx.Button(self.panel_one, id=2, label='Gmail') 
     self.outlook_button = wx.Button(self.panel_one, id=1, label='Outlook') 

     pv1box.Add(self.chrome_button, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.ALIGN_RIGHT) 
     pv1box.Add(self.outlook_button, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.ALIGN_RIGHT) 


     self.SetSize((450, 300)) 
     self.SetTitle('Prototype') 
     self.Centre() 
     self.Show(True) 


     self.Bind(wx.EVT_MENU, self.onQuit, quit) 
     self.Bind(wx.EVT_KEY_DOWN, self.onESCQuit, quit) 
     self.Bind(wx.EVT_MENU, self.onSwitchPanels, self.add_entry) 
     self.chrome_button.Bind(wx.EVT_BUTTON, self.onClick) 
     self.outlook_button.Bind(wx.EVT_BUTTON, self.onClick) 


    def onQuit(self, e): 

     dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) 
     input = dial.ShowModal() 

     if input == wx.ID_YES: 
      self.Close() 

    def onESCQuit(self, e): 
     esc = e.GetKey() 

     if esc == wx.WXK_ESCAPE: 
      dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) 
      input = dial.ShowModal() 

      if input == wx.ID_YES: 
       self.Close() 

    def onSwitchPanels(self, event): 
     if self.panel_one.IsShown(): 
      self.add_entry.SetText('Notifications') 
      self.panel_one.Hide() 
      self.panel_two.Show() 
     else: 
      self.add_entry.SetText('Add Entry') 
      self.panel_one.Show() 
      self.panel_two.Hide() 

    def onClick(self, event): 
     if event.Id == self.chrome_button.Id: 

      chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s' 
      # Without this path it will open in Internet Explorer 
      webbrowser.get(chrome_path).open('https://mail.google.com') 
     else: 
      chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s' 
      # Without this path it will open in Internet Explorer 
      webbrowser.get(chrome_path).open('https://outlook.live.com') 


def main(): 

    app = wx.App() 
    GUI(None) 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

回答

1

有一個單個sizer設置到框架上,兩個面板都是父框架,所以此sizer將它們定位在框架上。 這兩個按鈕是面板的每個面板,但框架分級器試圖將它們放在框架上時,他們是在面板上。 面板將需要每個尺寸,以便他們可以將按鈕放置在面板上。

你有

Frame 
--->vbox -> set to frame 
--->panel_one -> added to vbox 
------->chrome_button -> added to vbox 
--->panel_two -> added to vbox 
------->outlook_button -> added to vbox 

你需要

Frame 
--->vbox -> set to frame 
--->panel_one -> added to vbox 
------->p1vbox(new sizer) -> set to panel_one 
------->chrome_button -> added to p1vbox 
--->panel_two -> added to vbox 
------->p2vbox(new sizer) -> set to panel_two 
------->outlook_button -> added to p2vbox 

有了新的代碼添加按鈕的拉伸墊片兩側,使他們在中鋒位置。

pv1box.AddStretchSpacer() 
    pv1box.Add(self.chrome_button, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.ALIGN_RIGHT) 
    pv1box.Add(self.outlook_button, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER | wx.ALIGN_RIGHT) 
    pv1box.AddStretchSpacer() 
+0

我這樣做,並使其使兩個按鈕是相同的面板上,但他們仍然不會在底部中心:/ – javanewbie

+0

我會更新的拉伸間隔碼後 – javanewbie

+1

@javanewbie追加例題讓按鈕以最新版本的代碼爲中心。 – Yoriz