#!/usr/bin/env python2

import wx

app = wx.App()
frame = wx.Frame(None, size=(600, 480))
bs = wx.BoxSizer(wx.VERTICAL)
frame.SetSizer(bs)

class ListCtrl(wx.ListCtrl):
    def __init__(self):
        wx.ListCtrl.__init__(self, frame, style=wx.LC_REPORT)
        self.InsertColumn(0, 'x')
        self.SetColumnWidth(0, 1000)

        for i in range(100):
            self.InsertStringItem(i, 'x' * 100)

        self.Bind(wx.EVT_MOUSEWHEEL, self.handle_mousewheel)

    def handle_mousewheel(self, event):
        RATE = 20
        direction = event.GetWheelRotation() // abs(event.GetWheelRotation())

        if event.GetWheelAxis() == 0:
            print('List y')
            self.ScrollList(dx=0, dy=direction * RATE)
        elif event.GetWheelAxis() == 1:
            print('List x')
            self.ScrollList(dx=direction * RATE, dy=0)

        event.Skip()

class TextCtrl(wx.TextCtrl):
    def __init__(self):
        wx.TextCtrl.__init__(self, frame, style=wx.TE_MULTILINE |
                                                                wx.TE_DONTWRAP)

        for i in range(100):
            self.AppendText('x' * 100 + '\n')

        self.Bind(wx.EVT_MOUSEWHEEL, self.handle_mousewheel)

    def handle_mousewheel(self, event):
        # Vertical scrolling works natively
        if event.GetWheelAxis() == 1:
            print('Text x')
            self.ScrollWindow(dx=event.GetWheelRotation(), dy=0)

        event.Skip()

bs.Add(ListCtrl(), 1, flag=wx.EXPAND)
bs.Add(TextCtrl(), 1, flag=wx.EXPAND)
frame.Show()
frame.Centre()
app.MainLoop()
