2011-10-17 18 views
0

我想在wxPython中創建一個基本的日期選擇器/日曆。到目前爲止,我已經管理 將所有必需的小部件添加到我的網格,但我正在努力讓它們正確定位 。儘管有許多事情我不完全瞭解,但我對wx.SpinCtrl小部件感到特別沮喪,似乎是 被大型邊框包圍,儘管沒有指定任何東西。任何人都可以 告訴我如何刪除它?我希望旋轉控制僅距離框架頂部的幾個像素 ,文字「2月」距離控件底部的距離相同 。我嘗試了所有的方法,但似乎沒有任何影響 。wxPython:wx.SpinCtrl邊界管理

import wx 
import calendar 

MONTH_NAME_AS_KEY = {"January":1, "February":2, "March":3, "April":4, "May":5, "June":6, 
       "July":7, "August":8, "September":9, "October":10, "November":11, 
       "December":12} 

def getMonthNumber(nameAsString): 
    return MONTH_NAME_AS_KEY.get(nameAsString) 


class Example(wx.Frame): 

    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title=title,size=(300, 350)) 

     self.InitUI() 
     self.Centre() 
     self.Show() 

    def InitUI(self): 

     self.panel = wx.Panel(self) 

     mainSizer = wx.BoxSizer(wx.VERTICAL) 

     fgs = wx.FlexGridSizer(rows=2, cols=2) 

     # fgs 1: blank space 
     filler = wx.StaticText(self.panel, -1, label="") 
     fgs.Add(filler) 

     # fgs 2: creating containers 
     vSizer = wx.BoxSizer(wx.VERTICAL) 
     yearNavigationBox = wx.BoxSizer(wx.HORIZONTAL) 
     monthNavigationBox = wx.BoxSizer(wx.HORIZONTAL) 

     # year navigation 
     sc = wx.SpinCtrl(self.panel,-1, "", size=(70,70)) 
     sc.SetRange(1980,2060) 
     sc.SetValue(2011) 

     yearNavigationBox.Add(sc, wx.ALL, wx.EXPAND|wx.TOP) 

     # month navigation 
     monthDown = wx.StaticText(self.panel, -1, label="<")  
     monthUp = wx.StaticText(self.panel, -1, label=">")  


     monthName = wx.StaticText(self.panel, wx.ID_ANY, label="February") 

     monthNavigationBox.Add(monthDown) 
     monthNavigationBox.Add(monthName) 
     monthNavigationBox.Add(monthUp) 

     vSizer.Add(yearNavigationBox) 
     vSizer.Add(monthNavigationBox) 

     fgs.Add(vSizer) 

     # fgs 3: the date of the month writ large 
     date = wx.StaticText(self.panel, wx.ID_ANY, label='31', style=wx.ALIGN_CENTER) 
     dateFont = wx.Font(150, wx.DEFAULT, wx.NORMAL, wx.BOLD) 
     date.SetFont(dateFont) 

     fgs.Add(date) 


     # fgs 4: the date grid 
     dateSquareSizer = wx.GridSizer(rows=6, cols=7, hgap=1, vgap=6) 

     dayFont = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD) 
     days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 
     for item in days: 
      day = wx.StaticText(self.panel, wx.ID_ANY, label=item) 
      day.SetFont(dayFont) 
      dateSquareSizer.Add(day)  

     y = 2012 
     m = getMonthNumber(monthName.GetLabel())  

     gridData = list(calendar.Calendar().itermonthdays(y, m)) 
     while len(gridData)<43: gridData.append(0) 

     for i in gridData: 
      if i == 0: i="" 
      square = wx.StaticText(self.panel, wx.ID_ANY, label=str(i)) 
      square.SetFont(dayFont) 
      dateSquareSizer.Add(square, wx.ID_ANY)  

     fgs.Add(dateSquareSizer) 

     mainSizer.Add(fgs, wx.ALL, 2) 

     self.panel.SetSizer(mainSizer) 
     mainSizer.Fit(self) 



if __name__ == '__main__': 

    app = wx.App() 
    Example(None, title='') 
    app.MainLoop() 

回答

1

它看起來像你沒有足夠的sizer的添加簽名是正確的。它應該是sizer.Add(小部件,比例,標誌,邊框)

您繼續跳過比例並且根本沒有指定邊框。如果你這樣做,而不是:

yearNavigationBox.Add(sc, 0, wx.EXPAND|wx.TOP, 5) 

它將把微調5個像素下方的框架的頂部(或任何部件被這個前加入)。您還有其他地方可以跳過比例標誌並將其他隨機東西放在其位置上。你會想要通過並改變它。這裏有幾個教程:

+0

感謝邁克,通過這些教程已經走了,希望對小部件的定位稍微更好的抓地力。 –

+0

太棒了!我很高興你明白了。 –