2020年3月8日日曜日

wxpython ボタンイベントによりNotebookタブ選択、 それらをクラス化する


画像ボタン作成用画像フォルダの画像ファイルの数だけ 画像ボタンを作成のクラス
画像ボタンの数だけNotebookのタブを作成、 ボタンとタブ選別のイベントのクラス
上クラス作成した。





wxpython/お絵かき5/notebook10.py


1 # coding: UTF-8
  2 #panelの複数表示及び下panelにNotebookを貼り付け
  3 #ウィンドウの大きさが変わると同時にpanelの大きさが変わるようにし>
  4 #ウィンドウの分割をSplitterWindowにする
  5 #ボタンを押してNotebookのタブを切り替える
  6
  7 #@@@画像ボタン作成をクラス化
  8 #@@@画像ボタンの数により自動的にNotebookのタブの数を作成
  9 #@@@ボタンイベントもクラスに入れる
 10 #@@@ボタン表示がウィンドウの大きさが変わってもすっきり表示される
 11 #@@@ようにする
 12
 13
 14 import os
 15 import glob
 16 import wx
 17
 18
 19 BtList = []
 20 IdList = []
 21
 22 #p0の上にp1とnoteを配置する
 23 class MyFrame(wx.Frame):
 24     def __init__(self, parent):
 25         size = (400, 300)
 26         size = size
 27         wx.Frame.__init__(self, parent, -1, size=size)
 28         self.p0 = MySplitterWindow(self, size)
 29         self.p0.SetBackgroundColour("yellow")
 30         self.Show()
 31
 32 #frameの子ウィンドウ
 33 class MySplitterWindow(wx.SplitterWindow):
 34     def __init__(self, parent, size):
 35         wx.SplitterWindow.__init__(self, parent, -1)
 36
 37         #以下設定でウィンドウの大きさにつれ子パネルの大きさが変わ
 38         y = int(size[1] / 2)
 39         p1 = wx.Panel(self)
 40         p2 = wx.Panel(self)
 41         p1.SetBackgroundColour("green")
 42         p2.SetBackgroundColour("blue")
 43         #引数yのところ0で半々にウィンドウの大きさを設定するのも>
 44         #ない
 45         self.SplitHorizontally(p1, p2, y)
 46
 47         #p1にボタンを配置
 48         make_bt = MakeBitmapButtons("draw", p1)
 49         ##ボタンの数を得る
 50         bt_n = make_bt.getButtonLen()
 51
 52         #p2にNotebookを配置
 53         #sizerの上にnoteをおかないとnoteの表示がおかしくなる
 54         ly2 = wx.BoxSizer(wx.VERTICAL)
 55         note = MyNotebook(p2, bt_n)#2:ボタンの数
 56         ly2.Add(note, 1, wx.EXPAND)
 57         p2.SetSizer(ly2)
 58
 59         #ボタンをnoteにセット、ボタンとnoteのタブを関連付ける
 60         make_bt.setGazouToPnal_Bind(note)
 61
 62
 63 #parentを親にしてMyNotebookを作成する
 64 #bt_n(ボタンの数)だけタブを作成
 65 class MyNotebook(wx.Notebook):
 66     def __init__(self, parent, bt_n):
 67         wx.Notebook.__init__(self, parent, -1)
 68         self.parent = parent
 69
 70         #ボタンの数だけNotebookのタブを作成
 71         for n in range(bt_n):
 72             panl = wx.Panel(self, -1)
 73             self.AddPage(panl, "Page_"+str(n))
 74             # 固定テキスト1,2を パネル1,2に作成 
 75             wx.StaticText(panl, -1, "Text_"+str(n), pos=(20,20))
 76
 77     #ボタンのイベントはselectで受けボタンの区別はidでしている
 78     def select(self, event):
 79         print "select"
 80         #ボタンのidでイベントを決める事が出来る
 81         for id in IdList:
 82             print id
 83             if event.Id == id:
 84                 print event.Id
 85                 n = IdList.index(id)
 86                 #Notebookのタブの選択
 87                 self.SetSelection(n)
 88
 89
 90 #gazou_folderにある画像を全て画像ボタンにしてly(sizer)に貼り付け
 91 #それをpalにセットする。
 92 #画像の種類はsyuruiで定義したものに限る
 93 #gazou_folderに画像ファイル以外があってはならない
 94 class MakeBitmapButtons():
 95     def __init__(self, gazou_folder, pal):
 96         #self.FnList = []
 97         self.gazou_folder= gazou_folder
 98         self.pal = pal
 99         self.bt_n = 0
100         self.fpath = "./" + self.gazou_folder + "/*."
101
102     #gazou_folderのファイルの数を得る
103     def getButtonLen(self):
104         self.fpath = "./" + self.gazou_folder + "/*."
105         fpath_all = self.fpath + "*"
106         files = glob.glob(fpath_all)
107         self.bt_n = len(files)
108         return self.bt_n
109
110     #画像ボタンをNotebook に貼り付け、
111     #ボタンとNotebookのタブ選択と関連 付ける
112     def setGazouToPnal_Bind(self, note):
113         #print fpath
114         syurui= ["png", "jpg", "gif", "bmp", "jpeg"]
115         ly = wx.GridSizer(4, 3)
116
117         #gazou_folderにある全ての画像ファイルからそのボタンを作成
118         #例えば、現在のディレクトリに
119         #t_1.log, t_2.log, abc.log, test101.lst のファイルが存在>
120         #glob.glob('*.log') の実行により、['abc.log', 't_1.log',
121         #が返却されます。
122         for s in syurui:
123             fpath_all = self.fpath + s
124             files = glob.glob(fpath_all)
125             for f in files:
126                 #ファイルパスから拡張子を除いたファイル名を取得
127                 base = os.path.basename(f)
128                 fName = os.path.splitext(base)[0]
129                 #print "draw fName",fName
130
131                 image = wx.Image(f)
132                 image.Rescale(25,55)
133                 bm = image.ConvertToBitmap()
134                 ID = wx.NewId()
135                 bt = wx.BitmapButton(self.pal, ID, bm)
136                 bt.Bind(wx.EVT_BUTTON, note.select)
137
138                 ly.Add(bt, flag=wx.EXPAND|wx.ALL)
139                 #ly.Add(bt, 1, flag=wx.LEFT)
140

141                 BtList.append(bt)
142                 IdList.append(ID)
143
144         self.pal.SetSizer(ly)
145
146
147 if __name__ == '__main__':
148     app = wx.App(False)
149     MyFrame(None)
150     app.MainLoop()
                                                  

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts