RSS Twitter Facebook

2025/08/14 (2025年08月 のアーカイブ)

wxPython の ComboBox とマウスホイールの挙動のメモ

このところ wxPython で GUI を作ったりしていたのだけど、コンボボックス上でのマウスホイールの挙動が気に入らない。

コンボボックス上にマウスカーソルがある場合にマウスホイールの操作をすると選択肢が順次切り替わるのがデフォルト動作になっている。やりたい事はまあ分からなくもないのだけど、意識せずマウスカーソルがコンボボックス上に乗ってしまっている場合にホイールに触ってしまって選択肢が勝手に切り替わってしまうのがとても困る。

特にコンボボックスがスクロールパネル上にある場合、パネル上ではホイール操作でスクロールするので、スクロールした結果マウスカーソルがコンポボックスに乗ってしまうと次のホイール操作で選択肢が切り替わってしまう。これはまずい。

という事で、対応としては結局コンボボックス個別にハンドラを設定するしかないようだ。
wx.PostEvent(e.GetEventObject().GetParent().GetEventHandler(), e) という感じで親のパネルにイベントをそのまま流すのがよさそう。



import wx
import wx.lib.scrolledpanel

def Ignore(e):
wx.PostEvent(e.GetEventObject().GetParent().GetEventHandler(), e)

class MyFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title=title, size=(400, 200))
panel = wx.lib.scrolledpanel.ScrolledPanel(self)
panel.SetScrollbars(20,20,50,50)
combobox = wx.ComboBox(panel, -1, 'BBBBB', choices=('AAAAA','BBBBB','CCCCC', 'DDDDD'), pos=(400,100), size=(200,20), style=wx.CB_READONLY)
combobox.Bind(wx.EVT_MOUSEWHEEL, Ignore) # コンボボックスのマウスホイールイベントを親に流す
self.Show()

if __name__ == '__main__':
app = wx.App()
frame = MyFrame(None, "Test")
app.MainLoop()


ささいな小技だけど、その内忘れそうなのでメモ。

Posted by g200kg : 2025/08/14 11:20:40