私が書いたプログラムにいくつかの問題がありました。いくつかの背景のために、私はストリーミングウェブカメラクライアントを行うためにPython 2.7とwxPythonを使用しています。クライアントは、自分のスレッドでサーバーからイメージを取得し、キューに入れます。 GUIスレッドは、それらのイメージをQueueから取得し、wxBitmap
オブジェクトに変換します。これは0.5秒ごとに発生し、うまく動作します。 wxBitmap
オブジェクトをファイルとして保存できるので、すべてが正しく動作していることがわかります。wxPythonを使用してwxBitmapsを表示する際の問題
私が抱えている問題は、実際にはwxBitmap
オブジェクトがGUIに表示されていることです。私はGUIを作ることができるように思える唯一の事は、Webカム画像があるはずの灰色の矩形を表示することです。
は、ここで私は、画面をリフレッシュしたいときに呼び出される私のonPaint()
次のとおりです。
def onPaint(self,e):
## this is the function that actually draws and redraws the window
## to be displayed. I think it is something similar to blit()
## in other graphical display frameworks
print "in onPaint"
## create the device context object (graphics painter)
dc = wx.PaintDC(self)
dc.BeginDrawing()
## draw the bitmap to the screen
dc.DrawBitmap(self.imageBit,0,0,True)
dc.EndDrawing()
## test code.
## the following works and updates, which means that
## everything is being converted properly and updated.
## not sure why the dc won't paint it to the window.
self.imageBit.SaveFile("bit.bmp", wx.BITMAP_TYPE_BMP)
簡単に言えば、私はなぜその動作していないのと途方に暮れてよ。私の研究から、私はWindowsマシン上にあるので、BeginDrawing()
とEndDrawing()
の関数が必要なので、それらを追加しました。まだ動作しません。エラーや例外はスローされません。この問題を解決するのに役立つかもしれない
他の質問:
- 私は
wxFrame
オブジェクトを更新しています。おそらくwxPaintDC
は別のタイプのコンテナで動作する必要がありますか? - ?
実際には、私の__init__
機能が問題を抱えている可能性があります。私はこれを正しく設定していますか?
class viewWindow(wx.Frame):
imgSizer = (480,360)
def __init__(self, *args, **kw):
## this is called when an instance of this class is created
super(viewWindow,self).__init__(*args,**kw)
## here is where the actual stuff inside the frame is set up.
self.pnl = wx.Panel(self)
## create a button that opens up a Connection Window
#test = wx.Button(self.pnl, label='Connection Settings')
## test.Bind(wx.EVT_BUTTON, self.openConnectionWindow)
## create the wxImage for the web cam pic
self.image = wx.EmptyImage(self.imgSizer[0],self.imgSizer[1])
## create the wxBitmap so that the wxImage can be displayed
self.imageBit = wx.BitmapFromImage(self.image)
## create a timer that will update the window based of frame rate
self.timex = wx.Timer(self, wx.ID_OK)
self.timex.Start(500)
self.Bind(wx.EVT_TIMER, self.redraw, self.timex)
## need to do the following in order to display images in wxPython:
self.Bind(wx.EVT_PAINT, self.onPaint)
self.SetSize(self.imgSizer)
self.SetTitle('View Window')
self.Show()
とにかく、ありがとうございました。
EDIT:という行を削除して誤って問題を解決しました。
明らかに、それは適切にレンダリングされていましたが、ビットマップはパネルの下にありました。多分?私は本当にわからない。私はwxPython全体のこの新しいことです。
パネルの下に表示される画像は可能性があります。明示的に使用位置を 'wx.Sizer'に設定しない限り、オブジェクトのデフォルトは(0,0)になります。だから私は1つのアイテムしか持っていなくてもサイザーを使うのです。 – acattle