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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1436閲覧

python wxCheckListBoxの使い方

hiro04kon

総合スコア46

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2021/05/04 03:42

前提・実現したいこと

初心者です。python3で、wxFormBuilderを使いチェックリスト付きのバックアップソフトを作ろうと思っています。
2度目の投稿ですが、wx.CheckListBoxの仕組みがよく分かりません。

チェックリストの全選択、全選択解除、また、前回終了時に選択していたチェックの復元(他ファイルに保存を考えています)を実現したいのです。
以前の質問時に、wx.CheckListBoxを紹介してもらいましが、

wxCheckListBox::Check
void Check(int item, bool check = TRUE)

がうまく使えませんでした。

以下がsorceです。

python

1# -*- coding: utf-8 -*- 2 3########################################################################### 4## Python code generated with wxFormBuilder (version Oct 26 2018) 5## http://www.wxformbuilder.org/ 6## 7## PLEASE DO *NOT* EDIT THIS FILE! 8########################################################################### 9 10import wx 11import wx.xrc 12 13########################################################################### 14## Class MyFrame1 15########################################################################### 16 17class MyFrame1 ( wx.Frame ): 18 19 def __init__( self, parent ): 20 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 203,167 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) 21 22 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 23 24 bSizer1 = wx.BoxSizer( wx.VERTICAL ) 25 26 self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"バックアップするよ", wx.DefaultPosition, wx.DefaultSize, 0 ) 27 self.m_staticText1.Wrap( -1 ) 28 29 bSizer1.Add( self.m_staticText1, 0, wx.ALL, 5 ) 30 31 m_checkList1Choices = [u"file1", u"file2", u"file3"] 32 self.m_checkList1 = wx.CheckListBox( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_checkList1Choices, 0 ) 33 bSizer1.Add( self.m_checkList1, 0, wx.ALL, 5 ) 34 35 self.m_button1 = wx.Button( self, wx.ID_ANY, u"実行", wx.DefaultPosition, wx.DefaultSize, 0 ) 36 bSizer1.Add( self.m_button1, 0, wx.ALL, 5 ) 37 38 self.all_button3 = wx.Button( self, wx.ID_ANY, u"全選択", wx.DefaultPosition, wx.DefaultSize, 0 ) 39 bSizer8.Add( self.all_button3, 0, wx.ALL, 5 ) 40 41 self.no_button5 = wx.Button( self, wx.ID_ANY, u"全解除", wx.DefaultPosition, wx.DefaultSize, 0 ) 42 bSizer8.Add( self.no_button5, 0, wx.ALL, 5 ) 43 44 self.SetSizer( bSizer1 ) 45 self.Layout() 46 47 self.Centre( wx.BOTH ) 48 49 # Connect Events 50 self.m_button1.Bind( wx.EVT_BUTTON, self.m_button1OnButtonClick ) 51 self.all_button3.Bind( wx.EVT_BUTTON, self.all_button3OnButtonClick ) 52 self.no_button5.Bind( wx.EVT_BUTTON, self.no_button5OnButtonClick ) 53 54 def __del__( self ): 55 pass 56 57 58 # Virtual event handlers, overide them in your derived class 59 def m_button1OnButtonClick( self, event ): 60 event.Skip() 61 62 def all_button3OnButtonClick( self, event ): 63 **__ここにコード__** 64 event.Skip() 65 def all_button5OnButtonClick( self, event ): 66 **__ここにコード__** 67 event.Skip()

よろしくお願いします。

teamikl👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

void Check(int item, bool check = TRUE)がうまく使えませんでした。

item には、要素の添字(ゼロ開始)を指定します。

# Check() の使い方。第2引数は True: 選択 / False: 解除 for item in range(self.m_checkList1.Count): # 全要素を対象に... self.m_checkList1.Check(item, True) # 別解: 全選択 / 全解除 self.m_checkList1.SetCheckedItems(range(self.m_checkList1.Count)) self.m_checkList1.SetCheckedItems([]) # 空リストを指定で全解除

選択中の項目/表示名を得るには、
GetCheckedItems(), GetCheckedStrings() が使えます。

Items の値は、要素の内容が変わると変更される点には注意してください。


追記: 表示名を記録する場合の復元方法

python

1 2checkedList = [] # 選択されたラベルのリスト (ファイルに記録する内容) 3def button_save(event): 4 global checkedList 5 checkedList = self.m_checkList1.GetCheckedStrings() 6 7def button_load(event): 8 # FindString で項目が何番目かを探索 9 # 選択された項目のリスト→ 選択されたitemリスト に変換。 10 items = map(self.m_checkList1.FindString, labels) 11 items = [x for x in items if x != wx.NOT_FOUND] # 項目が見つからなかった場合を省く 12 self.m_checkList1.SetCheckedItems(items)

投稿2021/05/04 07:33

編集2021/05/05 07:01
teamikl

総合スコア8664

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

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

hiro04kon

2021/05/04 12:52

素早い回答、ありがとうございます。 全選択、解除はこれでいいんですね。簡単で素晴らしいです。 (結局void…は分かりませんが…) もう一つお聞きしたいのですが、選択中の項目を得る方法は分かりましたが、 最初にいくつかの項目にチェックを入れる方法が分かりません。 TFlist = [True,False,True] #1と3にチェックが入った状態にしたい for item in range(self.m_checkList1.Count): # 全要素を対象に... self.m_checkList1.Check(item, TFlist[item]) などと書いてみましたが、エラーになります。 すいませんが、お教えください。
teamikl

2021/05/04 16:01

void は wxWidgets (C++) の型の記述ですね。 戻り値がないという意味なので、気にしなくても大丈夫です。 wxPython のドキュメントには書かれてないはずです。 1と 3 にチェックを入れたい場合は、 その添字 0開始なので -1した値の[0, 2] をSetCheckedItemsに渡します。 for文で一つづつ設定する場合は、enumerate() 関数を使った繰り返しで TFlist = [True, False, True] for item, checked in enumerate(TFlist):   self.m_checkList1.Check(item, checked) ※コメント中の為、↑インデントは全角スペースを使ってます。 enumerate() を使う事で、TFileの要素の値(checked=True or False)と、 必要なitemの値(0開始のインデックス)を得られます。 繰り返し時の変数の内容 item=0, checked=True item=1, checked=False item=2, checked=True ---- エラーはどのようなエラーですか? 推測できる範囲では、 TFlist[item] としてるので、Count が4以上であれば リストの範囲外で、IndexError になると思います。
hiro04kon

2021/05/05 01:51

エラー内容は TypeError: CheckListBox.Check(): argument 1 has unexpected type 'str' でした。 調べたら、TFlist = [ ]の内容をテキストファイルから引用していたため、文字列として認識していたのが原因でした…。 str を bool に変換してできました! ありがとうございました!助かりました!
guest

0

前回のチェックしたリストを、'checklist.txt'に保存してあります。
True,False,False,… とリストの要素数分書いてあります。

old_checklist = [実行ファイルのパス] + "\" + 'checklist.txt' with open(old_checklist , "r") as tf: lines = tf.read().split(',') tflist = list(lines) def str2bool(s): return s.lower() in ['true']  ※'True'と大文字だとなぜかFalseになりますが… TFchecklist = [ str2bool(t) for t in tflist ] for item, checked in enumerate(TFchecklist): self.m_checkList1.Check(item, checked)

汚いコードかもしれませんが、これでチェックリストにチェックがつきました。

投稿2021/05/05 02:09

hiro04kon

総合スコア46

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

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

teamikl

2021/05/05 06:02

チェック状態のリストを保存する場合、 選択肢の途中追加に対応できませんが大丈夫ですか? 例えば、項目に Apple, Grape, Orange とあって、 Apple, Orange を選択 True, False, True のデータを保存。 2番目に Banana を追加した場合、項目がずれて Apple, Grape を選択になってしまいます。 選択肢が固定で後から絶対変更がない項目であれば大丈夫ですが、 仕様変更に対応できないので、 対応したい場合は、表示名をファイルに保存して、 itemの値(何番目の要素かを調べる) 逆引きが必要になるかもしれません。
hiro04kon

2021/05/05 07:43

なるほど。ありがとうございます。 今のところは、選択肢が増えることはなさそうなのですが、 仕様変更はありえることですので、逆引きも考えてみます。 何度もお答えいただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問