如何解决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 举报,一经查实,本站将立刻删除。