微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Wxpython动态更改Choice的内容

如何解决Wxpython动态更改Choice的内容

问题是用户界面中有两个“选择”下拉框,第二个框的内容最初为空,并且当用户在第一个框中选择一个选项时,相应的选项会出现在第二盒。 例如,如果第一个框是月,第二个框是日,并且用户选择一月,则第二个框将有1 ...。 31,用户选择2月,第二帧为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,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,m_choice1Choices,0 )
        self.m_choice1.SetSelection( 0 )
        bSizer9.Add( self.m_choice1,5 )

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

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


        self.SetSizer( bSizer9 )
        self.Layout()

        self.Centre( wx.BOTH )

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

`

解决方法

问题并非真正存在于wx.Choice中,而是我如何为不同月份提供不同的日期选项。

只需更改列表中的项目即可解决Choice问题,而Bind可以选择“月份”选项。
简而言之,如果更改了月份,则根据月份更改日期列表。 (小标题“ 9月,4月,6月和11月已有30天。其余时间只有31天,仅2月除外)”

下面,虽然没有经过测试,但是您明白了,我将月份选择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,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,m_choice1Choices,0 )
        self.m_choice1.SetSelection( 0 )
        bSizer9.Add( self.m_choice1,5 )

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

        bSizer9.Add( self.m_staticText15,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,self.m_choice2Choices,0 )
        self.m_choice2.SetSelection( 0 )
        bSizer9.Add( self.m_choice2,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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。