見出し画像

RaspberryPiでwxPython(2)

※一見さんへ:ハート(スキ)を押していただくと、関連する記事を書きやすくなります。お気軽に押してくださいね。

あらすじ

RaspberryPiに頑張ってwxPythonをコンパイルしてインストールしたけど、wxDCでグラフィックを描きたいのに上手く行かないのとほほ。。。

それからどした

仕方がないので、前回で怪しい挙動を示していると考えたDrawBitmapをもう少し使い方を探ってみることにしました。

前回のプログラムでは、画面描画のちらつきを抑えるために、BufferdDCでBitmapを描いてから、一気にClientDCに転送する方法を試しました。このときに転送をするためにDrawBitmapを使用しました。

この一連のプログラムのどこで問題が発生しているかを切り分けるため、まずはDrawBitmapの単純な使い方を試します。DrawBitmapはBitmap画像を表示させるためにも使えます。

import wx

class MyFrame(wx.Frame):
   def __init__(self):
       wx.Frame.__init__(self, None, -1, "Title", size=(330,360))
       # Bitmap読み込み
       self.bitmap = wx.Bitmap('fubuki.png')
       # 描画イベント
       self.Bind(wx.EVT_PAINT, self.OnPaint)
   def OnPaint(self, evt):
       dc = wx.PaintDC(self)
       dc.SetBackground(wx.Brush('sky blue'))
       dc.Clear()
       dc.DrawBitmap(self.bitmap, 10, 10)

if __name__ == '__main__':
   app = wx.App()
   MyFrame().Show()
   app.MainLoop()

DrawBitmapに問題があるかと思っていましたが、こちらのプログラムは問題なく動作しました。

ということは、プログラムのどこかで問題を引き起こしている部分がある・・・?

更に探っていくと

上記のプログラムに私の作ったプログラムの骨組みを再現するように、徐々に要素を書き加えていった所、あるところで描画ができない現象が再現できました。

その部分とは、

self.panel = wx.Panel(self, size=(324, 276))

私のプログラムでは、アプリのFrameを作った上に、Panelを作ってその上にグラフィックを描画していました。
なぜかというと、SetAcceleratorTableを使ってホットキーを登録しているのですが、この関数はFrame上では動作せず、Panel上でなければいけなかったためです。

というわけで、Panelを使わないようにして、Frame上に直接描画するように書き換えた所、RaspberryPi上で動かなかったプログラムが動作するようになりました。(なぜなのかは不明。。。)

ちなみにホットキーは、こちらもなぜか上手く行く手段が見つからず、マウスのボタン押下でイベント発生することで妥協しました。。。

self.Bind(wx.EVT_LEFT_DOWN, self.callhotkey)

それにしても、なぜPanelは使えなかったのか。。。
GUIの作りの違いによる影響なのですかねぇ、教えてえらい人!

この記事が気に入ったらサポートをしてみませんか?