質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1635閲覧

wxPython (wxFormBuilder)を使った画像の表示

gadai76

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/10/09 09:11

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

以上、御指南のほどよろしくお願いいたします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問