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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

1回答

7406閲覧

wxPython での画像の表示,表示サイズを後から変更したい

r.fukuda

総合スコア9

Python 3.x

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

0グッド

0クリップ

投稿2018/07/08 23:19

前提・実現したいこと

Python で画像表示をして 拡大縮小をしようとしています。
wxPython をつかって PIL でサイズを変更したものを
表示しようとしたのですが,読み込んだものが表示されたあと
サイズの変更をしようとすると,画像が重なったり表示されなかったりします。
おそらく,描画領域の初期化やサイズの変更がうまくいっていないものと
予想しています。
目的が達成されれば,十分なのでこの方法にこだわりません。

(メニューからファイルを選んで,表示,その後↑↓ で拡大縮小をさせる。
画像は必要に応じて拡大縮小させ,クリック時に画像上の座標を取るのが目的)
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージはほぼありません。
(いろいろ試しているときに,出てくるものはそのつど解決しています。)

エラーメッセージ

該当のソースコード

Python

# _*_ coding: shift_jis _*_ import wx import os from PIL import Image #import pdb STSIZE=(500,300) class MyApp(wx.App): def OnInit(self): self.setScw(STSIZE) self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) self.Bind(wx.EVT_KEY_DOWN, self.onKeyDown) self.imageLoad=False self.menu_bar = wx.MenuBar() self.menu_file = wx.Menu() # メニューアイテムを作る self.item_file_1 = wx.MenuItem(self.menu_file, 1, u'画像読み込み') self.item_file_2 = wx.MenuItem(self.menu_file, 2, u'終了') self.menu_file.Append(self.item_file_1) self.menu_file.Append(self.item_file_2) self.menu_bar.Append(self.menu_file, u'ファイル') self.frm.Bind(wx.EVT_MENU, self.menu_event) self.frm.SetMenuBar(self.menu_bar) self.frm.Show() return 1 def setScw(self,size): #pdb.set_trace() self.frm = wx.Frame(None, -1, "wx.Python", size) self.scWin = wx.ScrolledWindow(self.frm, -1) self.scWin.SetScrollbars(1, 1, size[0],size[1]) def menu_event(self, event): """ メニュー項目選択イベント """ menu_id = event.GetId() if menu_id == 1: self.OnOpen(); elif menu_id == 2: exit() def OnOpen(self): """ ファイルを開く """ self.dirname = '' dlg = wx.FileDialog(self.frm, "ファイルを選択してください", self.dirname, "", "*.*", wx.FD_OPEN ) if dlg.ShowModal() == wx.ID_OK: self.filename = dlg.GetFilename() self.dirname = dlg.GetDirectory() self.imgSize=list(STSIZE) self.img=Image.open(os.path.join(self.dirname, self.filename)); self.imageLoad=True tmpImg=self.img tmpImg.thumbnail(STSIZE, Image.ANTIALIAS) image1 = wx.Image(tmpImg.size[0],tmpImg.size[1]) image1.SetData(tmpImg.convert('RGB').tobytes()) #self.frm.SetSize(tmpImg.size) #self.scWin = wx.ScrolledWindow(self.frm, -1) #self.setScw(tmpImg.size) self.ItemSize = wx.StaticBitmap(self.scWin, -1, image1.ConvertToBitmap(), (0,0)) self.frm.Show() def OnMouseLeftDown(self, e): """ 左ボタンを押した時の処理 """ if self.imageLoad==True: pos = e.GetPosition() print (pos) def onKeyDown(self,evt): keycode = evt.GetKeyCode() if keycode==317: self.imgSize[0]=(self.imgSize[0]*10+5)//11 self.imgSize[1]=(self.imgSize[1]*10+5)//11 elif keycode==315: self.imgSize[0]=(self.imgSize[0]*11+5)//10 self.imgSize[1]=(self.imgSize[1]*11+5)//10 else: return None print (self.imgSize) tmpImg=self.img tmpImg.thumbnail(self.imgSize, Image.ANTIALIAS) image1 = wx.Image(tmpImg.size[0],tmpImg.size[1]) image1.SetData(tmpImg.convert('RGB').tobytes()) #self.scWin = wx.ScrolledWindow(self.frm, -1) self.setScw(tmpImg.size) self.ItemSize = wx.StaticBitmap(self.scWin, -1, image1.ConvertToBitmap(), (0,0)) app = MyApp() app.MainLoop()

試したこと

試行錯誤で,いろいろやっていますが,現在の状態は書き直したものは
まったく表示されていません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

描画領域の初期化のほうだけ。拡大縮小も憶測ですが同じ原因かと。

原因はwx.StaticBitmapで毎回生成しているのに、前の画像を破棄してないからです。
対策は
案1)前の画像を破棄する。

Python

1 def OnOpen(self): 2 # 中略 3 # ↓ここ 4 self.ItemSize = wx.StaticBitmap(self.scWin, -1, image1.ConvertToBitmap(), (0,0))

Python

1 def OnInit(self): 2 self.ItemSize = None '宣言、※Sizeだと大きさを連想させるので、別の変数名ImageCanvasなどの方が良いのではないでしょうか。 3 # 後略 4 def OnOpen(self): 5 if self.ItemSize is not None: 6 self.ItemSize.Destroy() 7 self.ItemSize = wx.StaticBitmap(self.scWin, -1, image1.ConvertToBitmap(), (0,0))

案2)Creating a Simple Photo Viewer with wxPythonを参考に、Panelにする。(wx.StaticBitmap生成回数を1回にする)
リンク先のサンプルコードを動かすには、style=wx.OPENstyle=wx.FD_OPENに変更してくださいな。

投稿2018/07/11 03:00

編集2018/07/11 03:08
umyu

総合スコア5846

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

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

r.fukuda

2018/07/12 03:14

最初のご提案の修正をしたところ,エラーなく動いたのですが,窓が新たにつくられ,動きが煩雑になりました。 2番目のご提案の方法とあわせてなんとか目的(同じ窓での拡大縮小) どおり動きました。 紹介していただいたサイトを中心に,いろいろ情報を得ることができ,だいぶ仕様もつかめてきました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問