2020年3月9日月曜日

wxpython 上のListCtrlの選択で下のNotebookのタブを選択する






/wxpython/お絵かき5/notebook11.py


 1 # coding: UTF-8
  2 #panelの複数表示及び下panelにNotebookを貼り付け
  3 #ウィンドウの大きさが変わると同時にpanelの大きさが変わるようにし>
  4 #ウィンドウの分割をSplitterWindowにする
  5 #ボタンを押してNotebookのタブを切り替える
  6
  7 #@@@画像ボタン作成をクラス化
  8 #@@@画像ボタンの数により自動的にNotebookのタブの数を作成
  9 #@@@ボタンイベントもクラスに入れる
 10 #@@@ボタン表示がウィンドウの大きさが変わってもすっきり表示される
 11 #@@@ようにする
 12 #@@@ 画像ボタンのかわりにListCtrを使う
 13
 14 #BitmapButtonをsizerでセットすると、ウィンドウの大きさが変わって>
 15 #配置が変わらないため表示が柔軟でない。
 16
 17 import os
 18 import glob
 19 import wx
 20
 21 BtList = []
 22 IdList = []
 23
 24 #p0の上にp1とnoteを配置する
 25 class MyFrame(wx.Frame):
 26     def __init__(self, parent):
 27         size = (400, 300)
 28         size = size
 29         wx.Frame.__init__(self, parent, -1, size=size)
 30         self.p0 = MySplitterWindow(self, size)
 31         self.p0.SetBackgroundColour("yellow")
 32         self.Show()
 33
 34 #frameの子ウィンドウ
 35 class MySplitterWindow(wx.SplitterWindow):
 36     def __init__(self, parent, size):
 37         wx.SplitterWindow.__init__(self, parent, -1)
 38
 39         #以下設定でウィンドウの大きさにつれ子パネルの大きさが変わ
 40         y = int(size[1] / 2)
 41         p1 = wx.Panel(self)
 42         p2 = wx.Panel(self)
 43         p1.SetBackgroundColour("green")
 44         p2.SetBackgroundColour("blue")
 45         #引数yのところ0で半々にウィンドウの大きさを設定するのも>
 46         #ない
 47         self.SplitHorizontally(p1, p2, y)
 48
 49         #p1にボタンを配置
 50         #make_bt = MakeBitmapButtons("draw", p1)
 51         #sizerの上にListCtrlをおかないと表示ができない
 52         ly1 = wx.BoxSizer(wx.VERTICAL)
 53         make_bt = MyListCtrl("draw", p1)
 54         ly1.Add(make_bt, 1, wx.EXPAND)
 55         p1.SetSizer(ly1)
 56         ##ボタンの数を得る
 57         bt_n = make_bt.getButtonLen()
 58
 59         #p2にNotebookを配置
 60         #sizerの上にnoteをおかないとnoteの表示がおかしくなる
 61         ly2 = wx.BoxSizer(wx.VERTICAL)
 62         note = MyNotebook(p2, bt_n)#2:ボタンの数
 63         ly2.Add(note, 1, wx.EXPAND)
 64         p2.SetSizer(ly2)
 65
 66     #   #ボタンをnoteにセット、ボタンとnoteのタブを関連付ける
 67         make_bt.setGazouToPnal_Bind(note)
 68
 69
 70 #parentを親にしてMyNotebookを作成する
 71 #bt_n(ボタンの数)だけタブを作成
 72 class MyNotebook(wx.Notebook):
 73     def __init__(self, parent, bt_n):
 74         wx.Notebook.__init__(self, parent, -1)
 75         self.parent = parent
 76
 77         #ボタンの数だけNotebookのタブを作成
 78         for n in range(bt_n):
 79             panl = wx.Panel(self, -1)
 80             self.AddPage(panl, "Page_"+str(n))
 81             # 固定テキスト1,2を パネル1,2に作成 
 82             wx.StaticText(panl, -1, "Text_"+str(n), pos=(20,20))
 83
 84     def select(self, select_index):
 85         self.SetSelection(select_index)
 86
 87
 88 #gazou_folderにある画像を全てListCtrlのアイテムにしてly(sizer)に>
 89 #付けそれをpalにセットする。
 90 #画像の種類はsyuruiで定義したものに限る
 91 #gazou_folderに画像ファイル以外があってはならない
 92 class MyListCtrl(wx.ListCtrl):
 93     def __init__(self, gazou_folder, parent):
 94         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_ICON)
 95         self.gazou_folder= gazou_folder
 96         self.bt_n = 0
 97         self.fpath = "./" + self.gazou_folder + "/*."
 98
 99     #gazou_folderのファイルの数を得る
100     def getButtonLen(self):
101         self.fpath = "./" + self.gazou_folder + "/*."
102         fpath_all = self.fpath + "*"
103         files = glob.glob(fpath_all)
104         self.bt_n = len(files)
105         return self.bt_n
106
107     #画像ボタンをpal に貼り付け、
108     #ボタンとNotebookのタブ選択と関連 付ける
109     def setGazouToPnal_Bind(self, note):
110         self.note = note
111
112         #以下の設定で画像の大きさは32×32ピクセルでないとダメ
113         imageList = wx.ImageList(32, 32)
114         #前コードでは以下としたが面倒なのでやめる
115         #syurui= ["png", "jpg", "gif", "bmp", "jpeg"]
116         syurui= ["jpg"]
117
118         #gazou_folderにある全ての画像ファイルからそのListCtrlアイ
119         #例えば、現在のディレクトリに
120         #t_1.log, t_2.log, abc.log, test101.lst のファイルが存在>
121         #glob.glob('*.log') の実行により、['abc.log', 't_1.log',
122         #が返却されます。
123         for s in syurui:
124             fpath_all = self.fpath + s
125             files = glob.glob(fpath_all)
126             for f in files:
127                 #ListCtrlを使うのにImageListを利用している
128                 #imageList.AddIcon(wx.Icon(f, wx.BITMAP_TYPE_PNG)
129                 imageList.AddIcon(wx.Icon(f, wx.BITMAP_TYPE_JPEG)
130
131         #ImageListを使えるようにしている?
132         self.AssignImageList(imageList, wx.IMAGE_LIST_NORMAL)
133
134         for i in range(self.bt_n):
135             #*InsertImageStringItem* ( index 、 label 、 imageIn
136             #ListCtrlにアイテムを追加 ImageListに見出し(label)も>
137             #けるようだ。今回はlabel表示やめる
138             self.InsertStringItem(i, '', i)
139         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnClik)
140
141     def OnClik(self, event):
142         # 選択したアイテムのインデックスを取得する
143         select_index = self.GetFirstSelected()
144         print "select_index"
145         print select_index
146         self.note.select(select_index)
147
148
149
150 #gazou_folderにある画像を全て画像ボタンにしてly(sizer)に貼り付け
151 #それをpalにセットする。
152 #画像の種類はsyuruiで定義したものに限る
153 #gazou_folderに画像ファイル以外があってはならない
154 class MakeBitmapButtons():
155     def __init__(self, gazou_folder, pal):
156         #self.FnList = []
157         self.gazou_folder= gazou_folder
158         self.pal = pal
159         self.bt_n = 0
160         self.fpath = "./" + self.gazou_folder + "/*."
161
162     #gazou_folderのファイルの数を得る
163     def getButtonLen(self):
164         self.fpath = "./" + self.gazou_folder + "/*."
165         fpath_all = self.fpath + "*"
166         files = glob.glob(fpath_all)
167         self.bt_n = len(files)
168         return self.bt_n
169
170     #画像ボタンをpal に貼り付け、
171     #ボタンとNotebookのタブ選択と関連 付ける
172     def setGazouToPnal_Bind(self, note):
173         #print fpath
174         syurui= ["png", "jpg", "gif", "bmp", "jpeg"]
175         ly = wx.GridSizer(4, 3)
176
177         #gazou_folderにある全ての画像ファイルからそのボタンを作成
178         #例えば、現在のディレクトリに
179         #t_1.log, t_2.log, abc.log, test101.lst のファイルが存在>
180         #glob.glob('*.log') の実行により、['abc.log', 't_1.log',
181         #が返却されます。
182         for s in syurui:
183             fpath_all = self.fpath + s
184             files = glob.glob(fpath_all)
185             for f in files:
186                 #ファイルパスから拡張子を除いたファイル名を取得
187                 base = os.path.basename(f)
188                 fName = os.path.splitext(base)[0]
189                 #print "draw fName",fName
190
191                 image = wx.Image(f)
192                 image.Rescale(25,55)
193                 bm = image.ConvertToBitmap()
194                 ID = wx.NewId()
195                 bt = wx.BitmapButton(self.pal, ID, bm)
196                 bt.Bind(wx.EVT_BUTTON, note.select)
197
198                 ly.Add(bt, flag=wx.EXPAND|wx.ALL)
199                 #ly.Add(bt, 1, flag=wx.LEFT)
200
201                 BtList.append(bt)
202                 IdList.append(ID)
203
204         self.pal.SetSizer(ly)
205
206
207 if __name__ == '__main__':
208     app = wx.App(False)
209     MyFrame(None)
210     app.MainLoop()
                                                  

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts