質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2842閲覧

wxpython comboboxで別のcomboboxの要素を動的に変えたい

yamatail

総合スコア77

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/06/02 01:31

今wxpythonモジュールで日付を設定するダイアログを作っています。
年と月と日をcomboboxで作っていつのですが、
日は月ごとに変わるので月のcomboboxイベントで日の要素を変更したいと思っています。

なかなかうまくいかず困っています。
ご存じの方いらっしゃいましたら、アドバイスいただけると助かります。

以下、コードです。

python

1# -*- coding: utf-8 -*- 2import wx 3import datetime 4 5#日にち 6dt_now = datetime.datetime.today() 7year_today = str(dt_now.year) 8month_today = str(dt_now.month) 9day_today = str(dt_now.day) 10 11def list2str(element): 12 return [str(i) for i in element] 13 14element_array_year = list2str([int(year_today) + i - 1 for i in range(3)]) 15element_array_month = list2str(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']) 16element_array_day_30 = list2str([i + 1 for i in range(30)]) 17element_array_day_31 = list2str([i + 1 for i in range(31)]) 18element_array_day_forFeb = list2str([i + 1 for i in range(28)]) 19element_array_day_forFeb_URUU = list2str([i + 1 for i in range(29)]) 20 21class SetupDialog(wx.Dialog): 22 23 """ダイアログの生成""" 24 25 def __init__(self, parent, id, title): 26 wx.Dialog.__init__(self, parent, id, title) 27 self.panel = wx.Panel(self, wx.ID_ANY) 28 self.year_type = 'heinen' 29 30 # print(today) 31 32 self.yearCbox = wx.ComboBox(self.panel, wx.ID_ANY, '年', choices=element_array_year, style=wx.CB_READONLY, size=(60,20)) 33 self.yeartext = wx.StaticText(self.panel, wx.ID_ANY, '年') 34 self.yearCbox.Bind(wx.EVT_COMBOBOX, self.year_event) 35 self.monthCbox = wx.ComboBox(self.panel, wx.ID_ANY, '月', choices=element_array_month, style=wx.CB_READONLY, size=(60,20)) 36 self.monthtext = wx.StaticText(self.panel, wx.ID_ANY, '月') 37 self.monthCbox.Bind(wx.EVT_COMBOBOX, self.month_event) 38 self.dayCbox = wx.ComboBox(self.panel, wx.ID_ANY, '日', choices=element_array_day_31, style=wx.CB_READONLY, size=(60,20)) 39 self.daytext = wx.StaticText(self.panel, wx.ID_ANY, '日以降を選択') 40 self.button = wx.Button(self.panel, wx.ID_OK, "リストアップ") 41 42 hbox = wx.BoxSizer(wx.HORIZONTAL) 43 hbox.Add(self.yearCbox) 44 hbox.Add(self.yeartext) 45 hbox.Add(self.monthCbox) 46 hbox.Add(self.monthtext) 47 hbox.Add(self.dayCbox) 48 hbox.Add(self.daytext) 49 50 v_layout = wx.BoxSizer(wx.VERTICAL) 51 v_layout.Add(hbox) 52 v_layout.Add(self.button) 53 54 self.panel.SetSizer(v_layout) 55 56 def year_event(self, event): 57 obj = event.GetEventObject() 58 year = int(obj.GetValue()) 59 print(year) 60 if year % 4 != 0: 61 self.year_type = 'heinen' 62 elif year % 100 != 0: 63 self.year_type = 'uruu' 64 elif year % 400 != 0: 65 self.year_type = 'heinen' 66 else: 67 self.year_type = 'uruu' 68 print(self.year_type) 69 70 71 def month_event(self, event): 72 obj = event.GetEventObject() 73 month = int(obj.GetValue()) 74 if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12: 75 self.dayCbox = wx.ComboBox(self.panel, wx.ID_ANY, '日', choices=element_array_day_31, style=wx.CB_READONLY, 76 size=(60, 20)) 77 elif month != 2: 78 self.dayCbox = wx.ComboBox(self.panel, wx.ID_ANY, '日', choices=element_array_day_30, style=wx.CB_READONLY, 79 size=(60, 20)) 80 elif self.year_type == 'heinen': 81 self.dayCbox = wx.ComboBox(self.panel, wx.ID_ANY, '日', choices=element_array_day_forFeb, style=wx.CB_READONLY, 82 size=(60, 20)) 83 else: 84 self.dayCbox = wx.ComboBox(self.panel, wx.ID_ANY, '日', choices=element_array_day_forFeb_URUU, style=wx.CB_READONLY, 85 size=(60, 20)) 86def main(): 87 app = wx.App() 88 frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム') 89 dialog = SetupDialog(frame, wx.ID_ANY, "ニューダイアログ") 90 dialog.ShowModal() 91 frame.Show() 92 app.MainLoop() 93 94if __name__ == '__main__': 95 main()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

イメージ説明

ComboBox の選択肢の動的変更は、
wxComboBox のドキュメント (API一覧)には、継承元のメソッドが載ってない点に注意。
リストはwx.ItemContainer のメソッドで変更できます。

  • Clear() で削除
  • AppendItems で新しいリストを追加

python

1# -*- coding: utf-8 -*- 2 3from calendar import Calendar 4import wx 5 6 7def main(): 8 9 app = wx.App() 10 frame = wx.Frame(None, wx.ID_ANY) 11 12 yearCB = wx.ComboBox(frame, choices=["2019", "2020", "2021"]) 13 monthCB = wx.ComboBox(frame, choices="1 2 3 4 5 6 7 8 9 10 11 12".split()) 14 dayCB = wx.ComboBox(frame) 15 hbox = wx.BoxSizer(wx.HORIZONTAL) 16 for widget in [yearCB, monthCB, dayCB]: 17 hbox.Add(widget) 18 frame.SetSizer(hbox) 19 20 def updateDays(event): 21 try: 22 year = int(yearCB.GetValue()) 23 month = int(monthCB.GetValue()) 24 print(year, month) 25 26 calendar = Calendar() 27 days = [str(d) for d in calendar.itermonthdays(year, month) if d] 28 dayCB.Clear() 29 dayCB.AppendItems(days) 30 except ValueError: 31 pass 32 33 yearCB.Bind(wx.EVT_COMBOBOX, updateDays) 34 monthCB.Bind(wx.EVT_COMBOBOX, updateDays) 35 36 if 0: 37 from wx.adv import DatePickerCtrl 38 datePicker = DatePickerCtrl(frame) 39 hbox.Add(datePicker) 40 41 frame.Show() 42 app.MainLoop() 43 44 45if __name__ == '__main__': 46 main() 47

wxには、標準で用意されてる日付選択コントロールもあります。

イメージ説明
イメージ説明

投稿2020/06/02 11:33

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamatail

2020/06/05 00:51

お返事遅くなり大変申し訳ございません。 いろいろな方法を教えてくださり大変勉強になります。 一度、試してみます。 ありがとうございました。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問