mieki256's diary



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 の両方で動くように、以下のような記述をしてみたり。
        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)) として誤魔化した。

まだまだ他にも変更された仕様があるはず。どこかに一覧は無いのかな。

以上です。

過去ログ表示

Prev - 2021/05 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project