2021/05/04(火) [n年前の日記]
#1 [wxpython] wxPython 4.1.1 を少し触ってる
昔、Python 2.7 を使っていた頃に書いていた、wxPython を利用するスクリプトを、Python 3.8.7 + wxPython 4.1.1 で動かそうとしたらエラーが出たり、非推奨の警告が出てしまった。
wxPython 4.x.x は、3.x.x と比べて、あちこちの仕様が変わっているようだなと。とりあえず一応は動作するように、ちょこちょこ修正してた。環境は Windows10 x64 20H2。
今回は、一つのスクリプトでも、wxPython 3.x.x と 4.x.x の両方で動くように、以下のような記述をしてみたり。
wx.version() で、wxPython のバージョンが得られるので、先頭の一文字を見て処理を分ける。みたいな。
ただ、こういう書き方は、あまり良くない気がする。例えば、将来的に、メジャーバージョン番号が2桁になった時は、確実に動作がおかしくなるわけで…。
Python自体のバージョンなら、メジャーバージョン値を取り出せるので、こういうのも少しはマシに書けそうだけど。
さておき。wxPython 3.x.x と 4.x.x で違っていると分かった点は以下。
wx.EVT_PAINT() や wx.EVT_SIZE() は非推奨になったらしい。self.Bind() で割り当てる模様。
wx.EmptyBitmap() は無くなった。wx.Bitmap() のコンストラクタが空のビットマップを返してくれる模様。
wx.Menu.Append() 内で、text= の指定は受け付けなくなった。
wx.Window.GetClientSizeTuple() は無くなった。おそらく wx.Window.GetClientSize() で代替できるのかな…。ただ、ウインドウが生成されてない時は (0, 0) が返ってきて、その後の処理で問題が発生するので、もし 0 が返ってきたら、仮で 1 を返すようにしておいたほうが良さそう。
wx.MemoryDC は、BeginDrawing()、EndDrawing() を呼べなくなった。とりあえず、単に省いてみたけど、一応動いているようには見える。ただ、これで正しいかどうかは分からない。
これは wxPython ではなくて、Python 2.7 と 3.x の違いだろうけど。random.randint(a, b) に渡す引数は int (整数) じゃないとダメなことになったらしい。とりあえず、random.randint(int(a), int(b)) として誤魔化した。
まだまだ他にも変更された仕様があるはず。どこかに一覧は無いのかな。
wxPython 4.x.x は、3.x.x と比べて、あちこちの仕様が変わっているようだなと。とりあえず一応は動作するように、ちょこちょこ修正してた。環境は Windows10 x64 20H2。
今回は、一つのスクリプトでも、wxPython 3.x.x と 4.x.x の両方で動くように、以下のような記述をしてみたり。
if int(wx.version()[0]) <= 3: # wxPython 3.x.x wx.EVT_PAINT(self, self.OnPaint) wx.EVT_SIZE(self, self.OnSize) else: # wxPython 4.x.x self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize)
wx.version() で、wxPython のバージョンが得られるので、先頭の一文字を見て処理を分ける。みたいな。
Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:19:08) [MSC v.1500 32 bit (Intel)] on win32 ... >>> import wx >>> wx.version() '3.0.2.0 msw (classic)'
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32 >>> import wx >>> wx.version() '4.1.1 msw (phoenix) wxWidgets 3.1.5'
ただ、こういう書き方は、あまり良くない気がする。例えば、将来的に、メジャーバージョン番号が2桁になった時は、確実に動作がおかしくなるわけで…。
Python自体のバージョンなら、メジャーバージョン値を取り出せるので、こういうのも少しはマシに書けそうだけど。
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32 >>> import sys >>> sys.version_info sys.version_info(major=3, minor=8, micro=7, releaselevel='final', serial=0) >>> sys.version_info.major 3追加モジュールに対してそういうことはできないのだろうか?
さておき。wxPython 3.x.x と 4.x.x で違っていると分かった点は以下。
wx.EVT_PAINT() や wx.EVT_SIZE() は非推奨になったらしい。self.Bind() で割り当てる模様。
if int(wx.version()[0]) <= 3: # wxPython 3.x.x wx.EVT_PAINT(self, self.OnPaint) wx.EVT_SIZE(self, self.OnSize) else: # wxPython 4.x.x self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize)
wx.EmptyBitmap() は無くなった。wx.Bitmap() のコンストラクタが空のビットマップを返してくれる模様。
if int(wx.version()[0]) <= 3: # wxPython 3.x.x self._Buffer = wx.EmptyBitmap(*Size) else: # wxPython 4.x.x self._Buffer = wx.Bitmap(*Size)
if int(wx.version()[0]) <= 3: # wxPython 3.x.x self.buffer = wx.EmptyBitmap(width, height) self.backbuffer = wx.EmptyBitmap(width, height) else: # wxPython 4.x.x self.buffer = wx.Bitmap(width, height) self.backbuffer = wx.Bitmap(width, height)
wx.Menu.Append() 内で、text= の指定は受け付けなくなった。
file_menu = wx.Menu() # item = file_menu.Append(wx.ID_ANY, text="&Open Image\tCtrl-O") item = file_menu.Append(wx.ID_ANY, "&Open Image\tCtrl-O") self.Bind(wx.EVT_MENU, self.LoadImage, item)
wx.Window.GetClientSizeTuple() は無くなった。おそらく wx.Window.GetClientSize() で代替できるのかな…。ただ、ウインドウが生成されてない時は (0, 0) が返ってきて、その後の処理で問題が発生するので、もし 0 が返ってきたら、仮で 1 を返すようにしておいたほうが良さそう。
# MaxX, MaxY = self.Window.GetClientSizeTuple() MaxX, MaxY = self.Window.GetClientSize() if MaxX == 0: MaxX = 1 if MaxY == 0: MaxY = 1
wx.MemoryDC は、BeginDrawing()、EndDrawing() を呼べなくなった。とりあえず、単に省いてみたけど、一応動いているようには見える。ただ、これで正しいかどうかは分からない。
dc = wx.MemoryDC() dc.SelectObject(self.backbuffer) if int(wx.version()[0]) <= 3: # wxPython 3.x.x dc.BeginDrawing() self.draw(dc) dc.EndDrawing() self.flip() else: # wxPython 4.x.x self.draw(dc) self.flip()
これは wxPython ではなくて、Python 2.7 と 3.x の違いだろうけど。random.randint(a, b) に渡す引数は int (整数) じゃないとダメなことになったらしい。とりあえず、random.randint(int(a), int(b)) として誤魔化した。
まだまだ他にも変更された仕様があるはず。どこかに一覧は無いのかな。
[ ツッコむ ]
以上です。