🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

1663閲覧

wxpythonで作成したGUIのultimatelistctrlに繰り返しで別の画像を挿入したい

able

総合スコア7

Python 3.x

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

0グッド

0クリップ

投稿2020/12/17 14:30

前提・実現したいこと

現在、wxpythonでultimatelistctrlを使ったGUIを作成しています。
繰り返しでultimatelistctrlのitemに別々の画像を挿入しようとしているのですが、最後にimagelistに加えた画像だけが挿入されてしまいます。どのようにすればよいかご教授いただきたく存じます。
また、チェックボックスと画像をカラムに中央揃え配置する方法についてもお願い致します。
以上の2点についてよろしくお願い致します。

該当のソースコード

python

1import wx 2from wx.lib.agw import ultimatelistctrl as ULC 3import wx.adv 4import os 5 6class MainPanel(wx.Panel): 7 def __init__(self, parent): 8 wx.Panel.__init__(self, parent) 9 10 # self.aquamarine = wx.Colour("LIGHT BLUE) 11 12 agwStyle = ( 13 ULC.ULC_HAS_VARIABLE_ROW_HEIGHT | wx.LC_REPORT | wx.LC_SINGLE_SEL) 14 15 self.ul = ULC.UltimateListCtrl( 16 self, agwStyle=agwStyle) 17 18 sizer = wx.BoxSizer(wx.VERTICAL) 19 sizer.Add(self.ul, 1, wx.EXPAND | wx.ALL, 5) 20 self.SetSizer(sizer) 21 22 mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT 23 24 def gen_column_header(name, kind=0, mask=mask): 25 info = ULC.UltimateListItem() 26 info._mask = mask 27 info._format = wx.LIST_FORMAT_CENTER 28 info._kind = kind 29 info._text = name 30 info._font = wx.Font(11, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, "") 31 return info 32 33 self.item = ["撮影日", "写真"] 34 self.width = [150,300] 35 36 for i in range(len(self.item)): 37 self.ul.InsertColumnInfo(i, gen_column_header(self.item[i], 1, mask | ULC.ULC_MASK_FONT)) 38 self.ul.SetColumnWidth(i, self.width[i]) 39 40 photolist=["a.png","b.png"] 41 colorlist=["LIGHT BLUE","LIGHT GREY"] 42 43 for i in range(2): 44 self.ul.InsertStringItem(i, "") 45 self.checkBox = wx.CheckBox(self.ul, wx.ID_ANY, "",(0,0), (-1,-1), 0, name=self.item[0]) 46 self.checkBox.SetLabel("撮影日") 47 self.checkBox.SetFont(wx.Font(14, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, "")) 48 self.ul.SetItemBackgroundColour(i, wx.Colour(colorlist[i])) 49 self.checkBox.SetBackgroundColour(wx.Colour(colorlist[i])) 50 self.ul.SetItemWindow(i, 0, self.checkBox, expand=True) 51 imagelist = wx.ImageList(300, 200) 52 imageidx = imagelist.Add(wx.Icon(photolist[i], wx.BITMAP_TYPE_ANY)) 53 self.ul.AssignImageList(imagelist, wx.IMAGE_LIST_SMALL) 54 self.ul.SetItemColumnImage(i,1,imageidx) 55 self.ul.SetItemBackgroundColour(i, wx.Colour(colorlist[i])) 56 57 def onClick(self, event): 58 img = Image.open(self.file) 59 img.show() 60 61class MainFrame(wx.Frame): 62 def __init__(self): 63 wx.Frame.__init__(self, None, title="frame", size=(500, 550)) 64 MainPanel(self) 65 self.Show() 66 67 68if __name__ == "__main__": 69 app = wx.App(False) 70 frame = MainFrame() 71 app.MainLoop()

補足情報(FW/ツールのバージョンなど)

Python 3.8.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

最後にimagelistに加えた画像だけが挿入されてしまいます。

ImageList 関連のコードを for文の外側に出します。

問題点は、SetItemColumnImage では ImageList の index 情報だけを持ち、
実際の画像は AssignImageList で関連付けされた ImageList が持ちます。
for 文内でImageList上書き設定しているため、最後のに設定されたImageListの画像が表示されます。

python

1imagelist = wx.ImageList(300, 200) 2self.ul.AssignImageList(imagelist, wx.IMAGE_LIST_SMALL) 3 4for i in range(2): 5 ...

現状は実行に問題なさそうですが、self.checkbox も同じ理由により、上書きしてしまってます。
→ 後から self.checkbox でチェックボックスを参照したい場合、最後しか参照できない。


チェックボックスと画像をカラムに中央揃え配置する方法

通常のテキストであれば item の SetAlign で中央にできるのですが、
独自ウィジェットや画像の場合はサポート外です。

  • wx.CheckBox の style オプションでは 右寄せのみサポート

 ALIGN_CENTER は指定してもエラーは出ないが変化なし。

wx.CheckBox(self.ul, wx.ID_ANY, "", (0,0), (-1,-1), wx.ALIGN_RIGHT, name=self.item[0])

とりあえず、思いつく代案は CustomRenderer で独自に描画する方法です。
自由度は高くなりますが、コードは少々複雑になります。

the renderer class must implement the methods DrawSubItem, GetLineHeight and GetSubItemWidth.

上記のメソッドを実装したクラスを作ります。(基底クラスは何でもいい)

  • GetLineHeight, GetSubItemWidth は数値を返すメソッド
  • DrawSubItem が独自の描画処理を担います。詳しくは OnPaint 等での描画を調べてください。

 wx.DC

公式のデモ内にサンプルコード有

投稿2020/12/18 02:08

teamikl

総合スコア8729

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

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

able

2020/12/19 07:42

teammilk様 ご回答ありがとうございます。 別々の画像を挿入することに成功しました。 中央揃えの件についても挑戦してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問