3次元の物体をx,y,zそれぞれの軸から見た断面像を得るプログラムをpythonで作っています。
matplotlibを用いてこのプログラムを作ることは出来たのですが、このプログラムのUIを
wxFormBuilderで作るところで躓いています。
ボタンを押すと画像が変化して欲しいのですが、変化しません。
色々と検索を掛けたところ、panelとmatplotlibの組み合わせでできそうなことはわかったのですが、
どのクラスになにを書けばよいのかわからず、困っています。
こういう感じでつくったものを
# prepare model 3D array, 100*100*100 cx=100 cy=100 cz=100 volume=cx*cy*cz test3D=np.arange(volume).reshape(cx,cy,cz)
下に示したように見たいのですが…
この後このtest3Dを変形させるので、x,y,zそれぞれの軸からみた結果をリアルタイムで
観察できるようにしたいです。
plt.imshow(test3D[:,0,:], cmap='gray', interpolation='none') plt.show
発生している問題・エラーメッセージ
図が更新されない
該当のソースコード
MyProject1MyFram
1#MyProject1MyFrame1.py 2 3"""Subclass of MyFrame1, which is generated by wxFormBuilder.""" 4 5import wx 6import myframe1 7 8from matplotlib.figure import Figure 9from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 10import numpy as np 11import os 12import cv2 13import matplotlib.pyplot as plt 14from matplotlib.image import imread 15from PIL import Image 16from mpl_toolkits.mplot3d import Axes3D 17 18# Implementing MyFrame1 19class MyProject1MyFrame1( myframe1.MyFrame1 ): 20 def __init__( self, parent ): 21 myframe1.MyFrame1.__init__( self, parent ) 22 23 # Handlers for MyFrame1 events. 24 def CubeSetOnButtonClick( self, event ): 25 # TODO: Implement CubeSetOnButtonClick 26 27 cx=int(self.CubeX.GetValue()) 28 cy=int(self.CubeY.GetValue()) 29 cz=int(self.CubeZ.GetValue()) 30 vol=cx*cy*cz 31 volt=str(vol) 32 self.m_staticText5.SetLabel(volt) 33 34 self.px.SetRange(0,cx-1) 35 self.py.SetRange(0,cy-1) 36 self.pz.SetRange(0,cz-1) 37 38 ppx=self.px.GetValue() 39 ppy=self.py.GetValue() 40 ppz=self.pz.GetValue() 41 42 global test3D 43 test3D=np.arange(vol).reshape(cx,cy,cz) 44 ximage=test3D[ppx,:,:] 45 yimage=test3D[:,ppy,:] 46 zimage=test3D[:,:,ppz] 47 48 imgx=wx.Image(ximage.shape[0], ximage.shape[1]) 49 imgx=imgx.Scale(250, 250, wx.IMAGE_QUALITY_HIGH) 50 self.x_image.SetBitmap(wx.Bitmap(imgx)) 51 52 imgy=wx.Image(yimage.shape[0], yimage.shape[1]) 53 imgy=imgy.Scale(250, 250, wx.IMAGE_QUALITY_HIGH) 54 self.y_image.SetBitmap(wx.Bitmap(imgy)) 55 56 imgz=wx.Image(zimage.shape[0], zimage.shape[1]) 57 imgz=imgz.Scale(250, 250, wx.IMAGE_QUALITY_HIGH) 58 self.z_image.SetBitmap(wx.Bitmap(imgz)) 59 self.Refresh() 60 pass
MyFrame1
1#MyFrame1.py 2# -*- coding: utf-8 -*- 3 4########################################################################### 5## Python code generated with wxFormBuilder (version Oct 26 2018) 6## http://www.wxformbuilder.org/ 7## 8## PLEASE DO *NOT* EDIT THIS FILE! 9########################################################################### 10 11import wx 12import wx.xrc 13 14########################################################################### 15## Class MyFrame1 16########################################################################### 17 18class MyFrame1 ( wx.Frame ): 19 20 def __init__( self, parent ): 21 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 923,473 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) 22 23 self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) 24 25 sbSizer1 = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, u"TomoTest" ), wx.VERTICAL ) 26 27 sbSizer2 = wx.StaticBoxSizer( wx.StaticBox( sbSizer1.GetStaticBox(), wx.ID_ANY, u"ModelCube" ), wx.HORIZONTAL ) 28 29 self.m_staticText1 = wx.StaticText( sbSizer2.GetStaticBox(), wx.ID_ANY, u"x:", wx.DefaultPosition, wx.DefaultSize, 0 ) 30 self.m_staticText1.Wrap( -1 ) 31 32 sbSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 ) 33 34 self.CubeX = wx.TextCtrl( sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 50,-1 ), 0 ) 35 sbSizer2.Add( self.CubeX, 0, wx.ALL, 5 ) 36 37 self.m_staticText2 = wx.StaticText( sbSizer2.GetStaticBox(), wx.ID_ANY, u"y:", wx.DefaultPosition, wx.DefaultSize, 0 ) 38 self.m_staticText2.Wrap( -1 ) 39 40 sbSizer2.Add( self.m_staticText2, 0, wx.ALL, 5 ) 41 42 self.CubeY = wx.TextCtrl( sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 50,-1 ), 0 ) 43 sbSizer2.Add( self.CubeY, 0, wx.ALL, 5 ) 44 45 self.m_staticText3 = wx.StaticText( sbSizer2.GetStaticBox(), wx.ID_ANY, u"z:", wx.DefaultPosition, wx.DefaultSize, 0 ) 46 self.m_staticText3.Wrap( -1 ) 47 48 sbSizer2.Add( self.m_staticText3, 0, wx.ALL, 5 ) 49 50 self.CubeZ = wx.TextCtrl( sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 50,-1 ), 0 ) 51 sbSizer2.Add( self.CubeZ, 0, wx.ALL, 5 ) 52 53 self.CubeSet = wx.Button( sbSizer2.GetStaticBox(), wx.ID_ANY, u"CubeSet", wx.DefaultPosition, wx.DefaultSize, 0 ) 54 sbSizer2.Add( self.CubeSet, 0, wx.ALL, 5 ) 55 56 self.m_staticText4 = wx.StaticText( sbSizer2.GetStaticBox(), wx.ID_ANY, u"volume:", wx.DefaultPosition, wx.DefaultSize, 0 ) 57 self.m_staticText4.Wrap( -1 ) 58 59 sbSizer2.Add( self.m_staticText4, 0, wx.ALL, 5 ) 60 61 self.m_staticText5 = wx.StaticText( sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) 62 self.m_staticText5.Wrap( -1 ) 63 64 sbSizer2.Add( self.m_staticText5, 0, wx.ALL, 5 ) 65 66 67 sbSizer1.Add( sbSizer2, 1, wx.EXPAND, 5 ) 68 69 sbSizer3 = wx.StaticBoxSizer( wx.StaticBox( sbSizer1.GetStaticBox(), wx.ID_ANY, u"Slice" ), wx.HORIZONTAL ) 70 71 sbSizer4 = wx.StaticBoxSizer( wx.StaticBox( sbSizer3.GetStaticBox(), wx.ID_ANY, u"x" ), wx.VERTICAL ) 72 73 self.px = wx.Slider( sbSizer4.GetStaticBox(), wx.ID_ANY, 50, 0, 100, wx.DefaultPosition, wx.Size( 250,-1 ), wx.SL_HORIZONTAL|wx.SL_MIN_MAX_LABELS|wx.SL_VALUE_LABEL ) 74 sbSizer4.Add( self.px, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) 75 76 self.x_image = wx.StaticBitmap( sbSizer4.GetStaticBox(), wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 250,250 ), 0 ) 77 sbSizer4.Add( self.x_image, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) 78 79 80 sbSizer3.Add( sbSizer4, 1, wx.EXPAND, 5 ) 81 82 sbSizer41 = wx.StaticBoxSizer( wx.StaticBox( sbSizer3.GetStaticBox(), wx.ID_ANY, u"y" ), wx.VERTICAL ) 83 84 self.py = wx.Slider( sbSizer41.GetStaticBox(), wx.ID_ANY, 50, 0, 100, wx.DefaultPosition, wx.Size( 250,-1 ), wx.SL_HORIZONTAL|wx.SL_MIN_MAX_LABELS|wx.SL_VALUE_LABEL ) 85 sbSizer41.Add( self.py, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) 86 87 self.y_image = wx.StaticBitmap( sbSizer41.GetStaticBox(), wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 250,250 ), 0 ) 88 sbSizer41.Add( self.y_image, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) 89 90 91 sbSizer3.Add( sbSizer41, 1, wx.EXPAND, 5 ) 92 93 sbSizer42 = wx.StaticBoxSizer( wx.StaticBox( sbSizer3.GetStaticBox(), wx.ID_ANY, u"z" ), wx.VERTICAL ) 94 95 self.pz = wx.Slider( sbSizer42.GetStaticBox(), wx.ID_ANY, 50, 0, 100, wx.DefaultPosition, wx.Size( 250,-1 ), wx.SL_HORIZONTAL|wx.SL_MIN_MAX_LABELS|wx.SL_VALUE_LABEL ) 96 sbSizer42.Add( self.pz, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) 97 98 self.z_image = wx.StaticBitmap( sbSizer42.GetStaticBox(), wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 250,250 ), 0 ) 99 sbSizer42.Add( self.z_image, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) 100 101 102 sbSizer3.Add( sbSizer42, 1, wx.EXPAND, 5 ) 103 104 105 sbSizer1.Add( sbSizer3, 1, wx.EXPAND, 5 ) 106 107 108 self.SetSizer( sbSizer1 ) 109 self.Layout() 110 111 self.Centre( wx.BOTH ) 112 113 # Connect Events 114 115 self.CubeSet.Bind( wx.EVT_BUTTON, self.CubeSetOnButtonClick ) 116 117 def __del__( self ): 118 pass 119 120 121 # Virtual event handlers, overide them in your derived class 122 123 124 def CubeSetOnButtonClick( self, event ): 125 event.Skip() 126 127 128
Main.py
1#! env python 2# -*- coding: utf-8 -*- 3 4import os 5import sys 6import wx 7from MyProject1MyFrame1 import MyProject1MyFrame1 8 9 10if __name__ == '__main__': 11 app = wx.App(False) 12 frame = MyProject1MyFrame1(None) 13 frame.Show(True) 14 15 app.MainLoop()
試したこと
https://white-wheels.hatenadiary.org/entry/20100327/p5
https://www.366service.com/jp/qa/0b717a212206dcde8c3e555b952fdad1
補足情報(FW/ツールのバージョンなど)
python 3.8.5
wxpython 4.1.0 msw (phoenix) wxWidgets 3.1.4
wx FormBuilder 3.9.0
以上、御指南のほどよろしくお願いいたします。
あなたの回答
tips
プレビュー