milk_spoonのブログ

さじの情報科学的活動、考えたこと、その他を雑記するためのブログです。

wxPythonで画像が切れたり余分に表示されてしまうときの対処

PythonGUI書きたいよね、と思ってwxPythonやってます。
QtはC++で書いたことあるし、PyQtのほうが良いんじゃ…と思いつつ。
正直書きやすく分かりやすくはないので人にオススメするかと思うとうーん
定数でレイアウト指定とかして、Pythonっぽくない…

でもまあ頑張ればそれなりに書けるので簡単なツールを手元で作ってます。
画像ビューア+αみたいな感じだけど、一つ詰まったことが…

下のようなサイズ違いの2つの画像を切り替えてGUIに表示すると
f:id:milk_spoon:20180108221240p:plain
f:id:milk_spoon:20180108221244p:plain

こんな風にめちゃくちゃな表示に(´;ω;`)
f:id:milk_spoon:20180108224707p:plain
f:id:milk_spoon:20180108224713p:plain

原因は、画像データを更新した後に画面のRefreshメソッドを呼んでいなかったことでした。
実際使うものを作ったときには画像が欠けてたりもして結構解決に時間をとりましたが、分かってみるとそりゃそうか、という感じです…
抜き出しでわかりづらいですがGUI上の画像変更のコードを以下のようにするとうまくいきます。

    #wx.Frameを継承したメイン画面クラスのメンバ
    def UpdateDisplay(self):
        #画像ファイルパスを指定して読み込み
        img = wx.Image(self.imagePaths[self.index])
        #StaticBitmapコントロールにセットする
        self.image.SetBitmap(img.ConvertToBitmap())
        #画面を更新する←これが抜けていた
        self.Refresh()

実際作ってるものはメインのwx.Frame継承クラスの子にさらにwx.Panelが何重かネストしてその中に画像があったりするんですが、一番上のself.Refreshだけでちゃんとなるので
あまりコントロール間の事は考えずself.Refreshが楽そうです
(wx.Window継承クラスならRefresh呼べるので一部Panelだけ更新ももちろんできるはず)

wxPythonで画像が欠けたり変な表示になってたらself.Refresh()!ということで
同じところで詰まる人がいませんよーにと祈ります。