プログラムで生活をHACKする

YRen-LaB

Python wxpython

【wxpython】ListCtrlでチェックボックス付きの表を作る

投稿日:


 

目的

こういうのをつくりたかった(つくった)

 

 

実装

一応公式にチェックボックスをつけるmixinが公開されている。
参考:wxpython CheckListCtrlMixin

以下の実装が上記mixinを使用したものとなっている
該当部分だけ切り抜いたので多少ん?と思う箇所がるかもしれない。


import pandas # csv操作ライブラリ
import configparser

import wx   # GUIライブラリ
import wx.lib.mixins.listctrl as listmix

import os

import menuEvent
import buttonEvent

import codecs

import glob
import numpy.random.common
import numpy.random.bounded_integers
import numpy.random.entropy
from wx import ImageFromStream, BitmapFromImage
import log

#-------------------------------------------------

#setting.ini読み込み    
config = configparser.ConfigParser()
config.read(R"..\setting.ini",encoding="utf-8")

# Header設定
header = (
            u"選択",\
            u"商品ID",\
            u"処理ステータス",\
            u"画像",\
            u"商品名",\
            u"取引状況",\
            u"出品日付",\
            u"出品時間",\
            u"在庫数"
        )

#-------------------------------------------------

class TestListCtrl(wx.ListCtrl, listmix.CheckListCtrlMixin, listmix.ListCtrlAutoWidthMixin):
    def __init__(self, panel, style):

        # wx.ListCtrl.__init__(self, *args, **kwargs)
        wx.ListCtrl.__init__(self, panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER,size=wx.Size(395, 467), pos=wx.Point(10, 20))
        listmix.CheckListCtrlMixin.__init__(self)
        listmix.ListCtrlAutoWidthMixin.__init__(self)

    def OnCheckItem(self, index, flag):
        print(index,flag)

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):

        wx.Frame.__init__(self, None ,wx.ID_ANY, 'test', size=(1000,500))
        self.panel = wx.Panel(self)

        self.list = TestListCtrl(self.panel, style=wx.LC_REPORT)

        # ListのHeader設定
        index = 0
        for head in header:
            if head == "選択":
                # チェックボックスのHeaderは中央寄せのサイズ70にする
                self.list.InsertColumn(index, head, wx.LIST_FORMAT_CENTER,70)
            else:
                self.list.InsertColumn(index, head, wx.LIST_FORMAT_LEFT,120)
            index += 1

        # csvからデータを読みこんで設定
        # 無し場合は空で画面表示
        master_path = config.get("path","output_csv_path")        
        if os.path.exists(master_path):
            with codecs.open(master_path,'r',encoding='cp932',errors="ignore") as csv_file:
                excel = pandas.read_csv(csv_file)
                # 1行を作成
                for excel_data in excel.values:   
                    self.list.Append([
                            "",                                                     # スペース入れないと、チェックボックスのカラムに文字列が入る
                            "" if "nan" == str(excel_data[1]) else excel_data[1],   # 商品ID
                            "",                                                     # 処理ステータス
                            "",                                                     # 画像
                            excel_data[2],                                          # 商品名
                            "未出品" if "nan" == str(excel_data[19]) else excel_data[19], # 取引状況
                            "" if "nan" == str(excel_data[16]) else excel_data[16], # 出品日時
                            "" if "nan" == str(excel_data[17]) else excel_data[17], # 出品時間
                            "" if "nan" == str(excel_data[18]) else excel_data[18], # 在庫数
                    ]) 

        # パネルにセット
        self.sizer = wx.BoxSizer(wx.VERTICAL) # メインのBox
        self.sizer.Add(self.list, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
        self.panel.SetSizerAndFit(self.sizer)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    win = MainWindow(None)
    app.MainLoop()


解説

class TestListCtrl()

    def __init__(self, panel, style):

        # wx.ListCtrl.__init__(self, *args, **kwargs)
        wx.ListCtrl.__init__(self, panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER,size=wx.Size(395, 467), pos=wx.Point(10, 20))
        listmix.CheckListCtrlMixin.__init__(self)
        listmix.ListCtrlAutoWidthMixin.__init__(self)

ListCtrlと各mixinの初期化
CheckListCtrlMixinは上で述べた通り、チェックボックスを追加する
参考:wxpython CheckListCtrlMixin

ListCtrlAutoWidthMixinは自動で横幅埋めてくれるやつっぽい。
参考:ListCtrlAutoWidthMixin

    def OnCheckItem(self, index, flag):
        print(index,flag)

チェックボックスをOn/Offした時のイベント
その行とTrue or Flaseが取得できる

class MainWindow(wx.Frame)

    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, None ,wx.ID_ANY, 'test', size=(1000,500))
        self.panel = wx.Panel(self)
        self.list = TestListCtrl(self.panel, style=wx.LC_REPORT)

Frame、Panel、先ほどのListCtrlの初期化

        # ListのHeader設定
        index = 0
        for head in header:
            if head == "選択":
                # チェックボックスのHeaderは中央寄せのサイズ70にする
                self.list.InsertColumn(index, head, wx.LIST_FORMAT_CENTER,70)
            else:
                self.list.InsertColumn(index, head, wx.LIST_FORMAT_LEFT,120)
            index += 1

        # csvからデータを読みこんで設定
        # 無し場合は空で画面表示
        master_path = config.get("path","output_csv_path")        
        if os.path.exists(master_path):
            with codecs.open(master_path,'r',encoding='cp932',errors="ignore") as csv_file:
                excel = pandas.read_csv(csv_file)
                # 1行を作成
                for excel_data in excel.values:   
                    self.list.Append([
                            "",                                                     # スペース入れないと、チェックボックスのカラムに文字列が入る
                            "" if "nan" == str(excel_data[1]) else excel_data[1],   # 商品ID
                            "",                                                     # 処理ステータス
                            "",                                                     # 画像
                            excel_data[2],                                          # 商品名
                            "未出品" if "nan" == str(excel_data[19]) else excel_data[19], # 取引状況
                            "" if "nan" == str(excel_data[16]) else excel_data[16], # 出品日時
                            "" if "nan" == str(excel_data[17]) else excel_data[17], # 出品時間
                            "" if "nan" == str(excel_data[18]) else excel_data[18], # 在庫数
                    ])

Listに表示するHeaerを設定し、表示するデータをcsvから取得している
InsertColumn()で列を追加し
self.list.append()でデータを格納している

 

 

まとめ

wxpython、見た感じもそこまで古臭くなく妥協のできるGUIライブラリ、
ただ、正直たったこれだけのことだが、調べるまでに時間がくっそかかった。
というのも、wxpythonの記事が日本には無さすぎる...

基本的な使い方の記事は山ほどあるがちょっと凝ったレイアウトにしようと思った途端
記事が見つからないので、基本は公式やwxpython wiki、Stack OverflowをGoogle先生に頼りながら見ていく必要があった。

次は、CheckListCtrlMixinを使用して最もハマった表中に画像を入れる部分を記事にします。





単純作業にお悩みではありませんか?

何百とあるワードを検索してファイルにまとめたり 数ある商品情報から条件にあるものだけ目で探してリ...

その単純作業プログラムで解決できるかもしれません。 もしよろしければ単純作業からの解放をお手伝いさせてください。

詳しくは以下のページからDM、または見積もり相談お願い致します。

お仕事依頼 ・ 見積もり依頼

adsense




-Python, wxpython
-,

Copyright© YRen-LaB , 2021 AllRights Reserved Powered by AFFINGER4.