【问题标题】:wxPython: wx.SpinCtrl border managementwxPython: wx.SpinCtrl 边框管理
【发布时间】:2011-10-18 02:18:18
【问题描述】:

我正在尝试在 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()

【问题讨论】:

    标签: python layout wxpython


    【解决方案1】:

    您似乎没有完全正确地使用 sizer 的 Add 签名。应该是sizer.Add(widget, ratio, flags, border)

    您一直跳过比例,根本没有指定边框。如果你这样做了:

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

    它会将微调器放在框架顶部下方 5 像素处(或在此之前添加的任何小部件)。您还有其他一些地方可以跳过比例标志并将其他随机的东西放在它的位置。你会想要经历并改变它。这里有几个教程:

    【讨论】:

    • 感谢 Mike,阅读了这些教程,希望对小部件定位有更好的把握。
    • 太棒了!很高兴你知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2022-01-25
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多