【问题标题】:Wxpython dynamically changes the content of Choicewxpython动态改变Choice的内容
【发布时间】:2020-09-16 03:11:01
【问题描述】:

问题是UI中有两个Choice下拉框,第二个框的内容最初是空的,当用户在第一个框中选择一个选项时,对应的选项出现在第二个盒子。 例如,如果第一个框是月份,第二个框是天,并且用户选择一月,那么第二个框有 1...。 31、用户选择二月,第二帧为1... 28。 我的代码如下。 `

import wx

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__ ( self, None, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        bSizer9 = wx.BoxSizer( wx.VERTICAL )

        self.m_staticText14 = wx.StaticText( self, wx.ID_ANY, u"select Month", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_staticText14.Wrap( -1 )

        bSizer9.Add( self.m_staticText14, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )

        # select month
        m_choice1Choices = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
        self.m_choice1 = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice1Choices, 0 )
        self.m_choice1.SetSelection( 0 )
        bSizer9.Add( self.m_choice1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )

        self.m_staticText15 = wx.StaticText( self, wx.ID_ANY, u"select Day", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_staticText15.Wrap( -1 )

        bSizer9.Add( self.m_staticText15, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
        
        # select day
        m_choice2Choices = [str(i) for i in range(1,31)]
        self.m_choice2 = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice2Choices, 0 )
        self.m_choice2.SetSelection( 0 )
        bSizer9.Add( self.m_choice2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )


        self.SetSizer( bSizer9 )
        self.Layout()

        self.Centre( wx.BOTH )

app = wx.App()
myFrame().Show()
app.MainLoop()

`

【问题讨论】:

    标签: user-interface wxpython


    【解决方案1】:

    问题实际上并不在于wx.Choice,而是我如何为不同月份提供不同的日期选项。

    Choice 问题只需通过更改其列表中的项目来解决,这可以通过将 Bind 更改为月份选项来完成。
    简而言之,如果更改月份,请根据月份更改日期列表。 (小曲“30天有九月、四月、六月和十一月。其余的都是31天,只有二月除外”)

    下面,有些未经测试,但你明白了,我 Bind 将月份选择设置为回调,它会重置所选月份的天数列表。
    作为旁注,检查您的range 命令,stop 值是它停止的位置,所以range(1,31) 会给您 1...30

    import wx
    import datetime
    from calendar import monthrange
    
    year = datetime.datetime.now().year
    month_days = []
    for i in range(1,13):
        month_days.append(monthrange(year,i)[1])
    
    class myFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__ ( self, None, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
    
            self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
    
            bSizer9 = wx.BoxSizer( wx.VERTICAL )
    
            self.m_staticText14 = wx.StaticText( self, wx.ID_ANY, u"select Month", wx.DefaultPosition, wx.DefaultSize, 0 )
            self.m_staticText14.Wrap( -1 )
    
            bSizer9.Add( self.m_staticText14, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
    
            # select month
            m_choice1Choices = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
            self.m_choice1 = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice1Choices, 0 )
            self.m_choice1.SetSelection( 0 )
            bSizer9.Add( self.m_choice1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
    
            self.m_staticText15 = wx.StaticText( self, wx.ID_ANY, u"select Day", wx.DefaultPosition, wx.DefaultSize, 0 )
            self.m_staticText15.Wrap( -1 )
    
            bSizer9.Add( self.m_staticText15, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
            
            # select day
            #m_choice2Choices = [str(i) for i in range(1,31)]
            mth_idx = self.m_choice1.GetSelection()
            self.m_choice2Choices = [str(i) for i in range(1,month_days[mth_idx]+1)]
    
            self.m_choice2 = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, self.m_choice2Choices, 0 )
            self.m_choice2.SetSelection( 0 )
            bSizer9.Add( self.m_choice2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
    
            self.m_choice1.Bind(wx.EVT_CHOICE, self.DaysInMonth)
    
            self.SetSizer( bSizer9 )
            self.Layout()
    
            self.Centre( wx.BOTH )
    
        def DaysInMonth(self, event):
            mth_idx = self.m_choice1.GetSelection()
            self.m_choice2Choices = [str(i) for i in range(1,month_days[mth_idx]+1)]        
            self.m_choice2.SetItems(self.m_choice2Choices)
    
    app = wx.App()
    myFrame().Show()
    app.MainLoop()
    

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 1970-01-01
      • 2015-09-24
      • 2017-11-17
      • 1970-01-01
      • 2018-10-14
      • 2013-06-14
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多