[londonlaw] Fix londonlaw not running with wxPython 3.0 (rhbz#1191318)

Hans de Goede jwrdegoede at fedoraproject.org
Fri Feb 20 14:46:16 UTC 2015


commit 7e10413d2b28b0fc8a79027d1bc65b18880dee72
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Fri Feb 20 15:46:13 2015 +0100

    Fix londonlaw not running with wxPython 3.0 (rhbz#1191318)

 londonlaw.spec       |   21 +-
 wxpy3.0-compat.patch | 2297 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2305 insertions(+), 13 deletions(-)
---
diff --git a/londonlaw.spec b/londonlaw.spec
index a483301..f0b0245 100644
--- a/londonlaw.spec
+++ b/londonlaw.spec
@@ -2,7 +2,7 @@
 
 Name:           londonlaw
 Version:        0.2.1
-Release:        17%{?dist}
+Release:        18%{?dist}
 Summary:        Online multiplayer version of a well known detective boardgame
 License:        GPLv2
 Group:          Amusements/Games
@@ -11,6 +11,7 @@ Source0:        http://pessimization.com/software/%{name}/%{name}-%{version}.tar
 Source1:        %{name}.desktop
 Source2:        %{name}-server.desktop
 Patch0:         londonlaw-0.2.1-new-twisted.patch
+Patch1:         wxpy3.0-compat.patch
 BuildRequires:  python-devel wxPython ghostscript ImageMagick
 BuildRequires:  tex(latex) tex(fullpage.sty) desktop-file-utils
 BuildArch:      noarch
@@ -30,6 +31,7 @@ Law features an attractive map overlaid on high-resolution satellite imagery.
 %prep
 %setup -q
 %patch0 -p1
+%patch1 -p1
 chmod +x setup.py
 
 
@@ -47,18 +49,8 @@ convert londonlaw/guiclient/images/playericon1.jpg -resize 48x48 \
    $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/48x48/apps/%{name}.png
 
 mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications
-desktop-file-install \
-%if 0%{?fedora} && 0%{?fedora} < 19
-  --vendor fedora    \
-%endif
-  --dir=${RPM_BUILD_ROOT}%{_datadir}/applications  \
-  %{SOURCE1}
-desktop-file-install \
-%if 0%{?fedora} && 0%{?fedora} < 19
-  --vendor fedora    \
-%endif
-  --dir=${RPM_BUILD_ROOT}%{_datadir}/applications  \
-  %{SOURCE2}
+desktop-file-install --dir=${RPM_BUILD_ROOT}%{_datadir}/applications %{SOURCE1}
+desktop-file-install --dir=${RPM_BUILD_ROOT}%{_datadir}/applications %{SOURCE2}
 
 
 %post
@@ -85,6 +77,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 
 
 %changelog
+* Fri Feb 20 2015 Hans de Goede <hdegoede at redhat.com> - 0.2.1-18
+- Fix londonlaw not running with wxPython 3.0 (rhbz#1191318)
+
 * Sat Jun 07 2014 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.2.1-17
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
 
diff --git a/wxpy3.0-compat.patch b/wxpy3.0-compat.patch
new file mode 100644
index 0000000..3b18fd4
--- /dev/null
+++ b/wxpy3.0-compat.patch
@@ -0,0 +1,2297 @@
+Description: Update for wxPython3.0 compatibility.
+Author: Olly Betts <olly at survex.com>
+Forwarded: no
+Bug-Debian: https://bugs.debian.org/759084
+Last-Update: 2014-08-15
+
+Index: londonlaw-0.2.1/londonlaw/guiclient/__init__.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/__init__.py
++++ londonlaw-0.2.1/londonlaw/guiclient/__init__.py
+@@ -17,13 +17,19 @@
+ 
+ # Note: unfortunately the twisted "wxreactor" is broken at present and is
+ # unlikely to be fixed anytime soon.  Rather than trying to integrate the event
+-# loops, the solution used here is to run a single-threaded wxApp with a wxTimer
++# loops, the solution used here is to run a single-threaded wx.App with a wx.Timer
+ # that runs the twisted event loop periodically.
+ 
+ 
+ from twisted.internet import protocol, reactor
+ from twisted.python import log
+-from wxPython.wx import *
++import wxversion
++try:
++	wxversion.select("3.0")
++except wxversion.VersionError:
++	wxversion.select("2.8")
++
++import wx
+ from ConnectWindow import *
+ from GameListWindow import *
+ from RegistrationWindow import *
+@@ -46,7 +52,7 @@ class LLawClientFactory(protocol.ClientF
+ 
+ 
+ # Run the whole shebang.
+-class MyApp(wxApp):
++class MyApp(wx.App):
+ 
+    def OnInit(self):
+       TIMERID = 999999
+@@ -57,14 +63,13 @@ class MyApp(wxApp):
+       messenger.registerRegistrationWindowLauncher(self.register)
+       messenger.registerMainWindowLauncher(self.startGame)
+ 
+-      wxInitAllImageHandlers()  # Required to be able to load compressed images
+       messenger.guiLaunchConnectionWindow()
+ 
+-      EVT_TIMER(self, TIMERID, self.OnTimer)
+-      self.timer = wxTimer(self, TIMERID)
++      wx.EVT_TIMER(self, TIMERID, self.OnTimer)
++      self.timer = wx.Timer(self, TIMERID)
+       self.timer.Start(250, False)
+ 
+-      return true
++      return True
+ 
+ 
+    def OnTimer(self, event):
+@@ -79,7 +84,7 @@ class MyApp(wxApp):
+       self.connectFrame.Fit()
+       self.connectFrame.Show(1)
+       self.currentWindow = self.connectFrame
+-      EVT_BUTTON(self.connectFrame, self.connectFrame.connectButton.GetId(), self.connect)
++      wx.EVT_BUTTON(self.connectFrame, self.connectFrame.connectButton.GetId(), self.connect)
+       return self.connectFrame
+ 
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/AutoListCtrl.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/AutoListCtrl.py
++++ londonlaw-0.2.1/londonlaw/guiclient/AutoListCtrl.py
+@@ -20,9 +20,9 @@
+ # AutoListCtrl.py
+ #
+ # This module contains a base class list control that does the following:
+-#     * sort by column when clicking on headers (wxColumnSorterMixin)
++#     * sort by column when clicking on headers (ColumnSorterMixin)
+ #     * auto-expands the width of the last column to fill available space
+-#       (wxListCtrlAutoWidthMixin)
++#       (ListCtrlAutoWidthMixin)
+ #     * supports realtime addition and removal of items
+ #
+ # This base class will be used in both the game room browser and the
+@@ -35,8 +35,8 @@
+ 
+ 
+ from twisted.python import log
+-from wxPython.wx import *
+-from wxPython.lib.mixins.listctrl import wxColumnSorterMixin, wxListCtrlAutoWidthMixin
++import wx
++from wx.lib.mixins.listctrl import ColumnSorterMixin, ListCtrlAutoWidthMixin
+ from londonlaw.common.config import *
+ import os.path
+ 
+@@ -44,37 +44,37 @@ import os.path
+ 
+ # the AutoWidthMixin simply resizes the last column of of the
+ # ListCtrl to take up all remaining space.
+-class AutoWidthListCtrl(wxListCtrl, wxListCtrlAutoWidthMixin):
+-   def __init__(self, parent, ID, pos = wxDefaultPosition,
+-         size = wxDefaultSize, style = 0):
+-      wxListCtrl.__init__(self, parent, ID, pos, size, style)
+-      wxListCtrlAutoWidthMixin.__init__(self)
++class AutoWidthListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin):
++   def __init__(self, parent, ID, pos = wx.DefaultPosition,
++         size = wx.DefaultSize, style = 0):
++      wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
++      ListCtrlAutoWidthMixin.__init__(self)
+ 
+ 
+ # 'headers' is a list of column headers.
+ # 'placeholder' should be a list of display data that is shown when
+ # the list is empty (same length as 'headers').
+-class AutoListCtrl(AutoWidthListCtrl, wxColumnSorterMixin):
++class AutoListCtrl(AutoWidthListCtrl, ColumnSorterMixin):
+    def __init__(self, parent, ID, headers, placeholder = None):
+-      AutoWidthListCtrl.__init__(self, parent, ID, wxDefaultPosition, wxDefaultSize,
+-            wxLC_REPORT|wxLC_SINGLE_SEL)
++      AutoWidthListCtrl.__init__(self, parent, ID, wx.DefaultPosition, wx.DefaultSize,
++            wx.LC_REPORT|wx.LC_SINGLE_SEL)
+ 
+       self.headers = headers
+ 
+-      # load in the tiny arrow images that wxColumnSorterMixin draws
++      # load in the tiny arrow images that ColumnSorterMixin draws
+       # in the headers of sorted columns
+       # WARNING: this segfaults if imageList is a local variable.
+       # Maybe a wxPython bug... imageList falls out of scope and gets deleted prematurely?
+-      self.imageList = wxImageList(16, 16, TRUE)
++      self.imageList = wx.ImageList(16, 16, True)
+       file1 = os.path.normpath(os.path.join(MEDIAROOT, "images/smalluparrow.png"))
+       file2 = os.path.normpath(os.path.join(MEDIAROOT, "images/smalldownarrow.png"))
+-      image = wxImage(file1, wxBITMAP_TYPE_ANY)
++      image = wx.Image(file1, wx.BITMAP_TYPE_ANY)
+       image.SetMaskColour(255, 255, 255)
+-      self.smallUpArrow = self.imageList.Add(wxBitmapFromImage(image))
+-      image = wxImage(file2, wxBITMAP_TYPE_ANY)
++      self.smallUpArrow = self.imageList.Add(wx.BitmapFromImage(image))
++      image = wx.Image(file2, wx.BITMAP_TYPE_ANY)
+       image.SetMaskColour(255, 255, 255)
+-      self.smallDnArrow = self.imageList.Add(wxBitmapFromImage(image))
+-      self.SetImageList(self.imageList, wxIMAGE_LIST_SMALL)
++      self.smallDnArrow = self.imageList.Add(wx.BitmapFromImage(image))
++      self.SetImageList(self.imageList, wx.IMAGE_LIST_SMALL)
+ 
+       self.placeholder = placeholder
+       # data from the server should be formatted as
+@@ -86,14 +86,14 @@ class AutoListCtrl(AutoWidthListCtrl, wx
+       self.populateList() 
+ 
+       # this must be called *after* the list has been created
+-      wxColumnSorterMixin.__init__(self, len(self.headers)) 
++      ColumnSorterMixin.__init__(self, len(self.headers)) 
+ 
+ 
+    def populateList(self):
+-      info          = wxListItem()
+-      info.m_mask   = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE | wxLIST_MASK_FORMAT
++      info          = wx.ListItem()
++      info.m_mask   = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT
+       info.m_image  = -1
+-      info.m_format = wxLIST_FORMAT_CENTRE
++      info.m_format = wx.LIST_FORMAT_CENTRE
+ 
+       for i in range(len(self.headers)):
+          info.m_text = self.headers[i]
+@@ -107,16 +107,16 @@ class AutoListCtrl(AutoWidthListCtrl, wx
+             self.SetStringItem(i, j, data[j])
+          self.SetItemData(i, key)
+ 
+-      # dirty hack... wxWidgets needs a wxLIST_AUTOSIZE_* that
++      # dirty hack... wxWidgets needs a wx.LIST_AUTOSIZE_* that
+       # chooses the maximum of BOTH header size and list item size
+       for i in range(len(self.headers) - 1):
+-         self.SetColumnWidth(i, wxLIST_AUTOSIZE) 
++         self.SetColumnWidth(i, wx.LIST_AUTOSIZE) 
+          itemWidth = self.GetColumnWidth(i)
+-         self.SetColumnWidth(i, wxLIST_AUTOSIZE_USEHEADER)
++         self.SetColumnWidth(i, wx.LIST_AUTOSIZE_USEHEADER)
+          headerWidth = self.GetColumnWidth(i)
+          if headerWidth < itemWidth:
+-            self.SetColumnWidth(i, wxLIST_AUTOSIZE) 
+-      # size of last column is set automatically by wxListCtrlAutoWidthMixin
++            self.SetColumnWidth(i, wx.LIST_AUTOSIZE) 
++      # size of last column is set automatically by ListCtrlAutoWidthMixin
+ 
+ 
+ #   def logListData(self):
+@@ -183,12 +183,12 @@ class AutoListCtrl(AutoWidthListCtrl, wx
+                self.SetItemData(item, key)
+ 
+ 
+-   # required by wxColumnSorterMixin
++   # required by ColumnSorterMixin
+    def GetListCtrl(self):
+       return self
+ 
+ 
+-   # used by wxColumnSorterMixin to display up and down arrows
++   # used by ColumnSorterMixin to display up and down arrows
+    # on sorted column headers
+    def GetSortImages(self):
+       return (self.smallDnArrow, self.smallUpArrow)
+Index: londonlaw-0.2.1/londonlaw/guiclient/ChatPanel.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/ChatPanel.py
++++ londonlaw-0.2.1/londonlaw/guiclient/ChatPanel.py
+@@ -21,38 +21,38 @@
+ #
+ # This class creates a combined chat entry and chat message display area.
+ 
+-from wxPython.wx import *
++import wx
+ from ScrolledLabel import *
+ 
+ # Wrapped in a StaticBox.
+-class ChatPanel(wxPanel):
++class ChatPanel(wx.Panel):
+    def __init__(self, parent, text, enableSendTo):
+-      wxPanel.__init__(self, parent, -1)
++      wx.Panel.__init__(self, parent, -1)
+ 
+ 
+       # create a scrollable display for the chat messages 
+       self.chatDisplay = ScrolledLabel(self, text)
+ 
+       # create the "send to" radio button
+-      self.chatRadio = wxRadioBox(self, -1, "send to:", wxDefaultPosition, wxDefaultSize,
+-         ["all", "team"], 1, wxRA_SPECIFY_COLS)
++      self.chatRadio = wx.RadioBox(self, -1, "send to:", wx.DefaultPosition, wx.DefaultSize,
++         ["all", "team"], 1, wx.RA_SPECIFY_COLS)
+       self.chatRadio.Enable(enableSendTo)
+ 
+       # create a chat entry box
+-      self.chatEntry = wxTextCtrl(self, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER)
++      self.chatEntry = wx.TextCtrl(self, -1, "", wx.DefaultPosition, wx.DefaultSize, wx.TE_PROCESS_ENTER)
+       self.chatEntry.SetMaxLength(254)  # messages longer than this would get truncated by ESocket.write_string()
+ 
+ 
+       # set up the geometry.
+       # line the chat display and the radio button horizontally...
+-      sizer2 = wxBoxSizer(wxHORIZONTAL)
+-      sizer2.Add(self.chatDisplay, 1, wxEXPAND|wxALL, 5)
+-      sizer2.Add(self.chatRadio, 0, wxALIGN_BOTTOM|wxALL, 5) 
++      sizer2 = wx.BoxSizer(wx.HORIZONTAL)
++      sizer2.Add(self.chatDisplay, 1, wx.EXPAND|wx.ALL, 5)
++      sizer2.Add(self.chatRadio, 0, wx.ALIGN_BOTTOM|wx.ALL, 5) 
+ 
+       # ... and line up the rest vertically
+-      self.topSizer = wxBoxSizer(wxVERTICAL)
+-      self.topSizer.Add(sizer2, 1, wxEXPAND)
+-      self.topSizer.Add(self.chatEntry, 0, wxEXPAND|wxALL, 5)
++      self.topSizer = wx.BoxSizer(wx.VERTICAL)
++      self.topSizer.Add(sizer2, 1, wx.EXPAND)
++      self.topSizer.Add(self.chatEntry, 0, wx.EXPAND|wx.ALL, 5)
+       self.SetSizer(self.topSizer)
+       self.topSizer.SetSizeHints(self)
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/ConnectWindow.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/ConnectWindow.py
++++ londonlaw-0.2.1/londonlaw/guiclient/ConnectWindow.py
+@@ -22,23 +22,23 @@
+ # This class handles the initial connection window, where players
+ # enter server information and provide usernames.
+ 
+-from wxPython.wx import *
++import wx
+ from twisted.internet import reactor
+ from londonlaw.common.protocol import *
+ import sys
+ 
+ 
+ # Initial window.  Creates a form for the user to enter a host, port, and user information.
+-class ConnectWindow(wxFrame):
++class ConnectWindow(wx.Frame):
+    def __init__(self, parent, ID, title):
+-      wxFrame.__init__(self, parent, ID, title)
++      wx.Frame.__init__(self, parent, ID, title)
+ 
+       EXIT = 100
+ 
+       # Create a menu bar
+-      fileMenu = wxMenu("File")
++      fileMenu = wx.Menu("File")
+       fileMenu.Append(EXIT, "Exit\tCTRL+Q", "Exit London Law")
+-      menuBar = wxMenuBar()
++      menuBar = wx.MenuBar()
+       menuBar.Append(fileMenu, "File")
+       self.SetMenuBar(menuBar)
+ 
+@@ -46,77 +46,77 @@ class ConnectWindow(wxFrame):
+       self.status = self.CreateStatusBar()
+ 
+       # stick everything in a panel to enable tab traversal
+-      mainPanel = wxPanel(self, -1)
++      mainPanel = wx.Panel(self, -1)
+ 
+-      labelFont = wxFont(self.GetFont().GetPointSize(), wxDEFAULT, wxNORMAL, wxBOLD)
+-      labelFont.SetWeight(wxBOLD)
+-      connectLabel = wxStaticText(mainPanel, -1, "Connect to: ")
++      labelFont = wx.Font(self.GetFont().GetPointSize(), wx.DEFAULT, wx.NORMAL, wx.BOLD)
++      labelFont.SetWeight(wx.BOLD)
++      connectLabel = wx.StaticText(mainPanel, -1, "Connect to: ")
+       connectLabel.SetFont(labelFont)
+-      self.hostEntryLabel = wxStaticText(mainPanel, -1, "host:", wxPoint(0,0))
+-      self.hostEntry      = wxTextCtrl(mainPanel, -1, "localhost", wxDefaultPosition, (170, wxDefaultSize[1]))
+-      self.portEntryLabel = wxStaticText(mainPanel, -1, "port:", wxPoint(0,0))
+-      self.portEntry      = wxTextCtrl(mainPanel, -1, str(LLAW_PORT), wxDefaultPosition, (50, wxDefaultSize[1]))
++      self.hostEntryLabel = wx.StaticText(mainPanel, -1, "host:", wx.Point(0,0))
++      self.hostEntry      = wx.TextCtrl(mainPanel, -1, "localhost", wx.DefaultPosition, (170, wx.DefaultSize[1]))
++      self.portEntryLabel = wx.StaticText(mainPanel, -1, "port:", wx.Point(0,0))
++      self.portEntry      = wx.TextCtrl(mainPanel, -1, str(LLAW_PORT), wx.DefaultPosition, (50, wx.DefaultSize[1]))
+       self.portEntry.SetMaxLength(5)
+ 
+-      connectSizer = wxBoxSizer(wxHORIZONTAL)
++      connectSizer = wx.BoxSizer(wx.HORIZONTAL)
+       connectSizer.Add((30,1),0,0)
+-      connectSizer.Add(self.hostEntryLabel, 0, wxALIGN_CENTRE | wxLEFT, 5)
+-      connectSizer.Add(self.hostEntry, 0, wxALIGN_CENTRE | wxALL, 5)
++      connectSizer.Add(self.hostEntryLabel, 0, wx.ALIGN_CENTRE | wx.LEFT, 5)
++      connectSizer.Add(self.hostEntry, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+       connectSizer.Add((10,1),0,0)
+-      connectSizer.Add(self.portEntryLabel, 0, wxALIGN_CENTRE)
+-      connectSizer.Add(self.portEntry, 0, wxALIGN_CENTRE | wxALL, 5)
++      connectSizer.Add(self.portEntryLabel, 0, wx.ALIGN_CENTRE)
++      connectSizer.Add(self.portEntry, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+ 
+-      userLabel = wxStaticText(mainPanel, -1, "User information: ")
++      userLabel = wx.StaticText(mainPanel, -1, "User information: ")
+       userLabel.SetFont(labelFont)
+-      self.usernameEntryLabel = wxStaticText(mainPanel, -1, "username:", wxPoint(0,0))
+-      self.usernameEntry = wxTextCtrl(mainPanel, -1)
++      self.usernameEntryLabel = wx.StaticText(mainPanel, -1, "username:", wx.Point(0,0))
++      self.usernameEntry = wx.TextCtrl(mainPanel, -1)
+       self.usernameEntry.SetMaxLength(20)
+-      self.passEntryLabel = wxStaticText(mainPanel, -1, "password:", wxPoint(0,0))
+-      self.passEntry = wxTextCtrl(mainPanel, -1, style=wxTE_PASSWORD)
++      self.passEntryLabel = wx.StaticText(mainPanel, -1, "password:", wx.Point(0,0))
++      self.passEntry = wx.TextCtrl(mainPanel, -1, style=wx.TE_PASSWORD)
+       self.passEntry.SetMaxLength(20)
+ 
+-      userSizer = wxBoxSizer(wxHORIZONTAL)
++      userSizer = wx.BoxSizer(wx.HORIZONTAL)
+       userSizer.Add((30,1),0,0)
+-      userSizer.Add(self.usernameEntryLabel, 0, wxALIGN_CENTRE)
+-      userSizer.Add(self.usernameEntry, 0, wxALIGN_CENTRE | wxALL, 5)
++      userSizer.Add(self.usernameEntryLabel, 0, wx.ALIGN_CENTRE)
++      userSizer.Add(self.usernameEntry, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+       userSizer.Add((10,1),1,1)
+-      userSizer.Add(self.passEntryLabel, 0, wxALIGN_CENTRE)
+-      userSizer.Add(self.passEntry, 0, wxALIGN_CENTRE | wxALL, 5)
++      userSizer.Add(self.passEntryLabel, 0, wx.ALIGN_CENTRE)
++      userSizer.Add(self.passEntry, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+ 
+       # Add some buttons
+-      self.connectButton = wxButton(mainPanel, -1, "Connect")
+-      self.quitButton    = wxButton(mainPanel, -1, "Quit")
+-      buttonSizer = wxBoxSizer(wxHORIZONTAL)
+-      buttonSizer.Add(self.quitButton, 0, wxALIGN_CENTRE | wxALL, 5)
++      self.connectButton = wx.Button(mainPanel, -1, "Connect")
++      self.quitButton    = wx.Button(mainPanel, -1, "Quit")
++      buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
++      buttonSizer.Add(self.quitButton, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+       if sys.platform.lower()[:-3] == "win":
+          # Win32 users like their buttons in the wrong order
+-         buttonSizer.Prepend(self.connectButton, 0, wxALIGN_CENTRE | wxALL, 5)
++         buttonSizer.Prepend(self.connectButton, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+       else:
+-         buttonSizer.Add(self.connectButton, 0, wxALIGN_CENTRE | wxALL, 5)
+-      buttonSizer.Prepend((10,1),1,wxEXPAND)
++         buttonSizer.Add(self.connectButton, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++      buttonSizer.Prepend((10,1),1,wx.EXPAND)
+ 
+-      self.topSizer = wxBoxSizer(wxVERTICAL)
+-      self.topSizer.Add(connectLabel, 0, wxALIGN_LEFT | wxLEFT | wxTOP, 10)
+-      self.topSizer.Add(connectSizer, 0, wxALIGN_LEFT | wxALL, 5)
+-      self.topSizer.Add(userLabel, 0, wxALIGN_LEFT | wxLEFT | wxTOP, 10)
+-      self.topSizer.Add(userSizer, 0, wxALIGN_LEFT | wxALL, 5)
+-      self.topSizer.Add((10,10),1,wxEXPAND)
+-      self.topSizer.Add(buttonSizer, 0, wxEXPAND | wxALL, 5)
++      self.topSizer = wx.BoxSizer(wx.VERTICAL)
++      self.topSizer.Add(connectLabel, 0, wx.ALIGN_LEFT | wx.LEFT | wx.TOP, 10)
++      self.topSizer.Add(connectSizer, 0, wx.ALIGN_LEFT | wx.ALL, 5)
++      self.topSizer.Add(userLabel, 0, wx.ALIGN_LEFT | wx.LEFT | wx.TOP, 10)
++      self.topSizer.Add(userSizer, 0, wx.ALIGN_LEFT | wx.ALL, 5)
++      self.topSizer.Add((10,10),1,wx.EXPAND)
++      self.topSizer.Add(buttonSizer, 0, wx.EXPAND | wx.ALL, 5)
+       mainPanel.SetSizer(self.topSizer)
+-      self.topSizer.Fit(mainPanel)
++      self.topSizer.Fit(self)
+       mainPanel.SetAutoLayout(1)
+ 
+       self.hostEntry.SetFocus()
+ 
+-      EVT_SET_FOCUS(self.hostEntry, self.selectFocused)
+-      EVT_SET_FOCUS(self.portEntry, self.selectFocused)
+-      EVT_SET_FOCUS(self.usernameEntry, self.selectFocused)
+-      EVT_SET_FOCUS(self.passEntry, self.selectFocused)
+-      EVT_BUTTON(self, self.quitButton.GetId(), self.menuExit)
+-      EVT_MENU(self, EXIT, self.menuExit)
++      wx.EVT_SET_FOCUS(self.hostEntry, self.selectFocused)
++      wx.EVT_SET_FOCUS(self.portEntry, self.selectFocused)
++      wx.EVT_SET_FOCUS(self.usernameEntry, self.selectFocused)
++      wx.EVT_SET_FOCUS(self.passEntry, self.selectFocused)
++      wx.EVT_BUTTON(self, self.quitButton.GetId(), self.menuExit)
++      wx.EVT_MENU(self, EXIT, self.menuExit)
+ 
+ 
+-   # select contents of a focused wxTextCtrl
++   # select contents of a focused wx.TextCtrl
+    def selectFocused(self, ev):
+       self.hostEntry.SetSelection(0,0)
+       self.portEntry.SetSelection(0,0)
+@@ -140,8 +140,8 @@ class ConnectWindow(wxFrame):
+ 
+    def showInfoAlert(self, info):
+       self.PushStatusText("")
+-      alert = wxMessageDialog(self, info,
+-         "Server Message", wxOK|wxICON_INFORMATION)
++      alert = wx.MessageDialog(self, info,
++         "Server Message", wx.OK|wx.ICON_INFORMATION)
+       alert.ShowModal()
+ 
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/GameListWindow.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/GameListWindow.py
++++ londonlaw-0.2.1/londonlaw/guiclient/GameListWindow.py
+@@ -25,7 +25,7 @@
+ 
+ 
+ from twisted.python import log
+-from wxPython.wx import *
++import wx
+ from londonlaw.common.protocol import *
+ from londonlaw.common.config import *
+ from AutoListCtrl import *
+@@ -35,54 +35,54 @@ import os.path
+ 
+ 
+ # Create a small dialog for creating a game
+-class NewGameDialog(wxDialog):
++class NewGameDialog(wx.Dialog):
+    def __init__(self, parent, returnValue):
+-      wxDialog.__init__(self, parent, -1, "Create a New Game", 
+-            wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxSUNKEN_BORDER)
+-      panel = wxPanel(self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
++      wx.Dialog.__init__(self, parent, -1, "Create a New Game", 
++            wx.DefaultPosition, wx.DefaultSize, wx.DEFAULT_DIALOG_STYLE|wx.SUNKEN_BORDER)
++      panel = wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
+ 
+       self.returnValue = returnValue
+ 
+-      labelFont = wxFont(self.GetFont().GetPointSize(), wxDEFAULT, wxNORMAL, wxBOLD)
+-      labelFont.SetWeight(wxBOLD)
+-      newGameLabel = wxStaticText(panel, -1, "New Game: ")
++      labelFont = wx.Font(self.GetFont().GetPointSize(), wx.DEFAULT, wx.NORMAL, wx.BOLD)
++      labelFont.SetWeight(wx.BOLD)
++      newGameLabel = wx.StaticText(panel, -1, "New Game: ")
+       newGameLabel.SetFont(labelFont)
+-      nameLabel         = wxStaticText(panel, -1, "game room name:", wxPoint(0,0))
+-      self.nameEntry    = wxTextCtrl(panel, -1, "", wxDefaultPosition, (170, wxDefaultSize[1]))
+-      typeLabel         = wxStaticText(panel, -1, "game type:", wxPoint(0,0))
+-      self.typeList     = wxChoice(panel, -1, wxDefaultPosition, wxDefaultSize, ["standard"])
+-      self.submitButton = wxButton(panel, wxID_OK, "OK")
+-      self.cancelButton = wxButton(panel, wxID_CANCEL, "Cancel")
++      nameLabel         = wx.StaticText(panel, -1, "game room name:", wx.Point(0,0))
++      self.nameEntry    = wx.TextCtrl(panel, -1, "", wx.DefaultPosition, (170, wx.DefaultSize[1]))
++      typeLabel         = wx.StaticText(panel, -1, "game type:", wx.Point(0,0))
++      self.typeList     = wx.Choice(panel, -1, wx.DefaultPosition, wx.DefaultSize, ["standard"])
++      self.submitButton = wx.Button(panel, wx.ID_OK, "OK")
++      self.cancelButton = wx.Button(panel, wx.ID_CANCEL, "Cancel")
+       self.typeList.SetSelection(0)
+ 
+-      hSizer = wxBoxSizer(wxHORIZONTAL)
++      hSizer = wx.BoxSizer(wx.HORIZONTAL)
+       hSizer.Add((30, 1), 0, 0)
+-      hSizer.Add(nameLabel, 0, wxALIGN_CENTRE|wxALL, 5)
+-      hSizer.Add(self.nameEntry, 0, wxALIGN_CENTRE|wxALL, 5)
++      hSizer.Add(nameLabel, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
++      hSizer.Add(self.nameEntry, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
+       hSizer.Add((10, 1), 0, 0)
+-      hSizer.Add(typeLabel, 0, wxALIGN_CENTRE|wxALL, 5)
+-      hSizer.Add(self.typeList, 0, wxALIGN_CENTRE|wxALL, 5)
++      hSizer.Add(typeLabel, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
++      hSizer.Add(self.typeList, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
+ 
+-      bSizer = wxBoxSizer(wxHORIZONTAL)
++      bSizer = wx.BoxSizer(wx.HORIZONTAL)
+       bSizer.Add((1, 1), 1, 0)
+-      bSizer.Add(self.cancelButton, 0, wxALIGN_CENTRE|wxALL, 5)
+-      bSizer.Add(self.submitButton, 0, wxALIGN_CENTRE|wxALL, 5)
++      bSizer.Add(self.cancelButton, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
++      bSizer.Add(self.submitButton, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
+ 
+-      vSizer = wxBoxSizer(wxVERTICAL)
+-      vSizer.Add(newGameLabel, 0, wxALIGN_LEFT|wxALL, 5)
+-      vSizer.Add(hSizer, 0, wxALIGN_LEFT|wxALL, 5)
+-      vSizer.Add(bSizer, 0, wxEXPAND|wxALL, 5)
++      vSizer = wx.BoxSizer(wx.VERTICAL)
++      vSizer.Add(newGameLabel, 0, wx.ALIGN_LEFT|wx.ALL, 5)
++      vSizer.Add(hSizer, 0, wx.ALIGN_LEFT|wx.ALL, 5)
++      vSizer.Add(bSizer, 0, wx.EXPAND|wx.ALL, 5)
+ 
+       panel.SetSizer(vSizer)
+       vSizer.Fit(panel)
+-      sizer = wxBoxSizer(wxVERTICAL)
+-      sizer.Add(panel, 1, wxEXPAND | wxALL, 5)
++      sizer = wx.BoxSizer(wx.VERTICAL)
++      sizer.Add(panel, 1, wx.EXPAND | wx.ALL, 5)
+       self.SetSizer(sizer)
+       sizer.Fit(self)
+       self.SetAutoLayout(1)
+ 
+-      EVT_BUTTON(self, wxID_OK, self.submit)
+-      EVT_BUTTON(self, wxID_CANCEL, self.cancel) 
++      wx.EVT_BUTTON(self, wx.ID_OK, self.submit)
++      wx.EVT_BUTTON(self, wx.ID_CANCEL, self.cancel) 
+ 
+ 
+    def submit(self, event):
+@@ -97,9 +97,9 @@ class NewGameDialog(wxDialog):
+ 
+ 
+ # Generate the main registration window.
+-class GameListWindow(wxFrame):
++class GameListWindow(wx.Frame):
+    def __init__(self, parent, ID, title, messenger):
+-      wxFrame.__init__(self, parent, ID, title)
++      wx.Frame.__init__(self, parent, ID, title)
+ 
+       self._messenger = messenger
+ 
+@@ -107,17 +107,17 @@ class GameListWindow(wxFrame):
+       EXIT       = 101
+ 
+       # Create a menu bar
+-      fileMenu = wxMenu("File")
++      fileMenu = wx.Menu("File")
+       fileMenu.Append(DISCONNECT, "Disconnect", "Disconnect from server")
+       fileMenu.Append(EXIT, "Exit\tCTRL+Q", "Exit London Law")
+-      menuBar = wxMenuBar()
++      menuBar = wx.MenuBar()
+       menuBar.Append(fileMenu, "File")
+       self.SetMenuBar(menuBar)
+ 
+       self.status = self.CreateStatusBar()
+ 
+       # stick everything in a panel
+-      mainPanel = wxPanel(self, -1)
++      mainPanel = wx.Panel(self, -1)
+ 
+       self.list = AutoListCtrl(mainPanel, -1,
+             ("Game Room", "Status", "Game Type", "Players"),
+@@ -126,27 +126,27 @@ class GameListWindow(wxFrame):
+       self.list.SetColumnWidth(1, 140) 
+       self.list.SetColumnWidth(2, 140) 
+ 
+-      mainSizer = wxBoxSizer(wxVERTICAL)
+-      mainSizer.Add(self.list, 1, wxALIGN_CENTRE|wxEXPAND|wxALL, 5)
++      mainSizer = wx.BoxSizer(wx.VERTICAL)
++      mainSizer.Add(self.list, 1, wx.ALIGN_CENTRE|wx.EXPAND|wx.ALL, 5)
+ 
+-      self.selectButton = wxButton(mainPanel, -1, "Join Game")
++      self.selectButton = wx.Button(mainPanel, -1, "Join Game")
+       self.selectButton.Disable()
+-      self.createButton = wxButton(mainPanel, -1, "New Game")
+-      buttonSizer = wxBoxSizer(wxHORIZONTAL)
+-      buttonSizer.Add((1, 1), 1, wxEXPAND)
+-      buttonSizer.Add(self.createButton, 0, wxALIGN_CENTRE | wxRIGHT | wxBOTTOM | wxALL, 5)
+-      buttonSizer.Add(self.selectButton, 0, wxALIGN_CENTRE | wxRIGHT | wxBOTTOM | wxALL, 5)
+-      mainSizer.Add(buttonSizer, 0, wxEXPAND, 0)
++      self.createButton = wx.Button(mainPanel, -1, "New Game")
++      buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
++      buttonSizer.Add((1, 1), 1, wx.EXPAND)
++      buttonSizer.Add(self.createButton, 0, wx.ALIGN_CENTRE | wx.RIGHT | wx.BOTTOM | wx.ALL, 5)
++      buttonSizer.Add(self.selectButton, 0, wx.ALIGN_CENTRE | wx.RIGHT | wx.BOTTOM | wx.ALL, 5)
++      mainSizer.Add(buttonSizer, 0, wx.EXPAND, 0)
+ 
+       mainPanel.SetSizer(mainSizer)
+       mainSizer.Fit(mainPanel)
+ 
+-      EVT_MENU(self, EXIT, self.menuExit)
+-      EVT_MENU(self, DISCONNECT, self.menuDisconnect)
+-      EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.enableSelectButton)
+-      EVT_LIST_ITEM_DESELECTED(self, self.list.GetId(), self.disableSelectButton)
+-      EVT_BUTTON(self, self.selectButton.GetId(), self.joinGame)
+-      EVT_BUTTON(self, self.createButton.GetId(), self.createGame)
++      wx.EVT_MENU(self, EXIT, self.menuExit)
++      wx.EVT_MENU(self, DISCONNECT, self.menuDisconnect)
++      wx.EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.enableSelectButton)
++      wx.EVT_LIST_ITEM_DESELECTED(self, self.list.GetId(), self.disableSelectButton)
++      wx.EVT_BUTTON(self, self.selectButton.GetId(), self.joinGame)
++      wx.EVT_BUTTON(self, self.createButton.GetId(), self.createGame)
+ 
+ 
+    def addGame(self, data):
+@@ -160,7 +160,7 @@ class GameListWindow(wxFrame):
+ 
+ 
+    def enableSelectButton(self, event):
+-      self.selectButton.Enable(TRUE)
++      self.selectButton.Enable(True)
+ 
+ 
+    def disableSelectButton(self, event):
+@@ -176,29 +176,29 @@ class GameListWindow(wxFrame):
+    
+ 
+    def joinGame(self, event):
+-      selected = self.list.GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)
++      selected = self.list.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED)
+       self._messenger.netJoinGame(self.list.GetItemText(selected))  
+ 
+ 
+    def showInfoAlert(self, info):
+       self.PushStatusText("")
+-      alert = wxMessageDialog(self, info,
+-         "Server Message", wxOK|wxICON_INFORMATION)
++      alert = wx.MessageDialog(self, info,
++         "Server Message", wx.OK|wx.ICON_INFORMATION)
+       alert.ShowModal()
+ 
+ 
+    def menuExit(self, event):
+-      alert = wxMessageDialog(self, "Disconnect from the server and exit London Law?",
+-         "Disconnect and Quit", wxYES_NO|wxICON_EXCLAMATION)
+-      if alert.ShowModal() == wxID_YES:
++      alert = wx.MessageDialog(self, "Disconnect from the server and exit London Law?",
++         "Disconnect and Quit", wx.YES_NO|wx.ICON_EXCLAMATION)
++      if alert.ShowModal() == wx.ID_YES:
+          self._messenger.netDisconnect()
+          self.Close()
+ 
+ 
+    def menuDisconnect(self, event):
+-      alert = wxMessageDialog(self, "Disconnect from the server?",
+-         "Disconnect", wxYES_NO|wxICON_EXCLAMATION)
+-      if alert.ShowModal() == wxID_YES:
++      alert = wx.MessageDialog(self, "Disconnect from the server?",
++         "Disconnect", wx.YES_NO|wx.ICON_EXCLAMATION)
++      if alert.ShowModal() == wx.ID_YES:
+          self._messenger.netDisconnect()
+          self._messenger.guiLaunchConnectionWindow()
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/HistoryWindow.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/HistoryWindow.py
++++ londonlaw-0.2.1/londonlaw/guiclient/HistoryWindow.py
+@@ -22,27 +22,27 @@
+ # has a scroll bar to control the view.
+ 
+ 
+-from wxPython.wx import *
++import wx
+ from TextPanel import *
+ from StaticBitmap import *
+ from londonlaw.common.config import *
+ import os, sys, string
+ 
+-class HistoryWindow(wxScrolledWindow):
++class HistoryWindow(wx.ScrolledWindow):
+    def __init__(self, parent):
+-      wxScrolledWindow.__init__(self, parent)
++      wx.ScrolledWindow.__init__(self, parent)
+ 
+       # load in the ticket images
+       self.ticketImages = []
+       for i in range(5):
+          filename = os.path.normpath(os.path.join(MEDIAROOT, "images/ticket" + str(i) + ".png"))
+-         self.ticketImages.append(wxImage(filename, wxBITMAP_TYPE_ANY))
++         self.ticketImages.append(wx.Image(filename, wx.BITMAP_TYPE_ANY))
+ 
+       # the toplevel sizer is this two-column FlexGridSizer;
+       # the left column is filled with vertical wxBoxSizers,
+       # each of which places the turn number above Mr. X's
+       # known locations.
+-      self.ticketSizer = wxFlexGridSizer(24, 2, 0, 0)
++      self.ticketSizer = wx.FlexGridSizer(24, 2, 0, 0)
+ 
+       self.vbSizers     = []
+       self.turns        = []
+@@ -55,28 +55,28 @@ class HistoryWindow(wxScrolledWindow):
+       self.panels2      = []
+       self.panelSizers2 = []
+       for i in range(24):
+-         self.panels.append(wxPanel(self, -1, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER))
++         self.panels.append(wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER))
+          self.turns.append(TextPanel(self.panels[i], " Turn " + str(i+1) + " ",
+             12, 0))
+          self.locations.append(TextPanel(self.panels[i], " ", 16, 0))
+ 
+-         self.vbSizers.append(wxBoxSizer(wxVERTICAL))
+-         self.vbSizers[i].Add(self.turns[i], 1, wxEXPAND|wxCENTRE|wxADJUST_MINSIZE)
+-         self.vbSizers[i].Add(self.locations[i], 1, wxEXPAND|wxCENTRE|wxADJUST_MINSIZE)
++         self.vbSizers.append(wx.BoxSizer(wx.VERTICAL))
++         self.vbSizers[i].Add(self.turns[i], 1, wx.EXPAND|wx.CENTRE|wx.ADJUST_MINSIZE)
++         self.vbSizers[i].Add(self.locations[i], 1, wx.EXPAND|wx.CENTRE|wx.ADJUST_MINSIZE)
+ 
+-         self.panelSizers.append(wxBoxSizer(wxHORIZONTAL))
+-         self.panelSizers[i].Add(self.vbSizers[i], 1, wxEXPAND)
++         self.panelSizers.append(wx.BoxSizer(wx.HORIZONTAL))
++         self.panelSizers[i].Add(self.vbSizers[i], 1, wx.EXPAND)
+          self.panels[i].SetSizerAndFit(self.panelSizers[i])
+ 
+-         self.panels2.append(wxPanel(self, -1, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER))
+-         self.tickets.append(StaticBitmap(self.panels2[i], -1, wxBitmapFromImage(self.ticketImages[4])))
++         self.panels2.append(wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER))
++         self.tickets.append(StaticBitmap(self.panels2[i], -1, wx.BitmapFromImage(self.ticketImages[4])))
+ 
+-         self.panelSizers2.append(wxBoxSizer(wxHORIZONTAL))
+-         self.panelSizers2[i].Add(self.tickets[i], 1, wxEXPAND)
++         self.panelSizers2.append(wx.BoxSizer(wx.HORIZONTAL))
++         self.panelSizers2[i].Add(self.tickets[i], 1, wx.EXPAND)
+          self.panels2[i].SetSizerAndFit(self.panelSizers2[i])
+ 
+-         self.ticketSizer.Add(self.panels[i], 0, wxEXPAND|wxCENTRE|wxLEFT|wxTOP, 5)
+-         self.ticketSizer.Add(self.panels2[i], 0, wxEXPAND|wxCENTRE|wxLEFT|wxTOP|wxRIGHT, 5)
++         self.ticketSizer.Add(self.panels[i], 0, wx.EXPAND|wx.CENTRE|wx.LEFT|wx.TOP, 5)
++         self.ticketSizer.Add(self.panels2[i], 0, wx.EXPAND|wx.CENTRE|wx.LEFT|wx.TOP|wx.RIGHT, 5)
+ 
+       self.showSurfacingTurns()
+ 
+@@ -86,12 +86,12 @@ class HistoryWindow(wxScrolledWindow):
+ #      pform = string.lower(sys.platform)
+ #      if pform.startswith("win") or pform.startswith("darwin"):
+       (w, h) = self.ticketSizer.GetMinSize()
+-      self.ticketSizer.SetMinSize(wxSize(w+15, h))
++      self.ticketSizer.SetMinSize(wx.Size(w+15, h))
+ 
+       self.ticketSizer.Fit(self)
+       self.SetScrollRate(0, 10)
+ 
+-      # The following doesn't seem to work in wxGTK...
++      # The following doesn't seem to work in wx.GTK...
+       # self.SetSizerAndFit(self.ticketSizer)
+ 
+ 
+@@ -101,15 +101,15 @@ class HistoryWindow(wxScrolledWindow):
+       self.locations[turnNum].Destroy()
+       self.locations[turnNum] = TextPanel(self.panels[turnNum], " " + locStr + " ",
+          16, 0)
+-      self.vbSizers[turnNum].Add(self.locations[turnNum], 1, wxEXPAND|wxCENTRE)
++      self.vbSizers[turnNum].Add(self.locations[turnNum], 1, wx.EXPAND|wx.CENTRE)
+ 
+       self.panelSizers[turnNum].Layout()
+ 
+ 
+    # update one of the ticket graphics 
+    def setTicket(self, turnNum, tickNum):
+-      self.tickets[turnNum].SetBitmap(wxBitmapFromImage(self.ticketImages[tickNum]))
+-      self.tickets[turnNum].Refresh(FALSE)
++      self.tickets[turnNum].SetBitmap(wx.BitmapFromImage(self.ticketImages[tickNum]))
++      self.tickets[turnNum].Refresh(False)
+ 
+ 
+    # draw question marks for the location entries where Mr. X will
+Index: londonlaw-0.2.1/londonlaw/guiclient/MainWindow.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/MainWindow.py
++++ londonlaw-0.2.1/londonlaw/guiclient/MainWindow.py
+@@ -21,7 +21,7 @@
+ # This class handles the main in-game window.  It has a map window,
+ # a set of player status icons, a chat area, and some useful buttons.
+ 
+-from wxPython.wx import *
++import wx
+ from MapWindow import *
+ from ChatPanel import *
+ from PlayerIcon import *
+@@ -33,11 +33,11 @@ import time
+ 
+ 
+ 
+-class MainWindow(wxFrame):
++class MainWindow(wx.Frame):
+    # players is a list of Mr. X and all detectives, their
+    # positions, and their tokens
+    def __init__(self, parent, ID, title, username, playerList, messenger):
+-      wxFrame.__init__(self, parent, ID, title)
++      wx.Frame.__init__(self, parent, ID, title)
+       
+       self.username         = username
+       self.playerList       = playerList
+@@ -62,18 +62,18 @@ class MainWindow(wxFrame):
+       self.ABOUT      = 105
+ 
+       # Create a menu bar
+-      menuBar = wxMenuBar()
+-      self.fileMenu = wxMenu()
++      menuBar = wx.MenuBar()
++      self.fileMenu = wx.Menu()
+       self.fileMenu.Append(self.DISCONNECT, "Disconnect", "Disconnect from server")
+       self.fileMenu.Append(self.EXIT, "Exit\tCTRL+Q", "Exit London Law")
+       menuBar.Append(self.fileMenu, "File")
+-      self.viewMenu = wxMenu()
++      self.viewMenu = wx.Menu()
+       self.viewMenu.AppendCheckItem(self.FULLSCREEN, "Fullscreen Map\tCTRL+F11", "Toggle fullscreen map view")
+       self.viewMenu.AppendCheckItem(self.ZOOM, "Map Zoom\tCTRL+Z", "Toggle map zoom level")
+       self.viewMenu.AppendCheckItem(self.HISTORY, "Mr. X History\tCTRL+Y", "Show/hide the Mr. X history window")
+-      self.viewMenu.Check(self.HISTORY, true)
++      self.viewMenu.Check(self.HISTORY, True)
+       menuBar.Append(self.viewMenu, "View")
+-      self.helpMenu = wxMenu()
++      self.helpMenu = wx.Menu()
+       self.helpMenu.Append(self.ABOUT, "About London Law", "About London Law")
+       menuBar.Append(self.helpMenu, "Help")
+       self.SetMenuBar(menuBar)
+@@ -91,7 +91,7 @@ class MainWindow(wxFrame):
+ 
+       # contain everything in a panel to get rid of the lame dark grey
+       # background in Win32
+-      self.panel = wxPanel(self, -1)
++      self.panel = wx.Panel(self, -1)
+ 
+       # create the map window
+       self.mapWindow = MapWindow(self.panel, usernameList)
+@@ -113,39 +113,39 @@ class MainWindow(wxFrame):
+       self.icons = PlayerIconGroup(self.panel, usernameList, tokenList)
+ 
+       # create the pushbuttons
+-      self.moveButton = wxButton(self.panel, -1, "Move")
+-      self.moveButton.Enable(false)
+-      self.historyButton = wxCheckBox(self.panel, -1, "View History")
+-      self.historyButton.SetValue(true)
+-      self.zoomButton = wxCheckBox(self.panel, -1, "Zoom")
+-      self.buttonSizer = wxBoxSizer(wxVERTICAL)
+-      self.buttonSizer.Add(self.zoomButton, 0, wxALL, 5)
+-      self.buttonSizer.Add(self.historyButton, 0, wxALL, 5)
+-      self.buttonSizer.Add(self.moveButton, 0, wxALL, 5)
++      self.moveButton = wx.Button(self.panel, -1, "Move")
++      self.moveButton.Enable(False)
++      self.historyButton = wx.CheckBox(self.panel, -1, "View History")
++      self.historyButton.SetValue(True)
++      self.zoomButton = wx.CheckBox(self.panel, -1, "Zoom")
++      self.buttonSizer = wx.BoxSizer(wx.VERTICAL)
++      self.buttonSizer.Add(self.zoomButton, 0, wx.ALL, 5)
++      self.buttonSizer.Add(self.historyButton, 0, wx.ALL, 5)
++      self.buttonSizer.Add(self.moveButton, 0, wx.ALL, 5)
+ 
+       # create a history window
+       self.historyWin = HistoryWindow(self.panel)
+ 
+-      self.centerSizer = wxBoxSizer(wxHORIZONTAL)
+-      self.centerSizer.Add(self.icons, 0, wxALIGN_CENTRE|wxALL)
+-      self.centerSizer.Add(self.buttonSizer, 0, wxALIGN_CENTRE)
++      self.centerSizer = wx.BoxSizer(wx.HORIZONTAL)
++      self.centerSizer.Add(self.icons, 0, wx.ALIGN_CENTRE|wx.ALL)
++      self.centerSizer.Add(self.buttonSizer, 0, wx.ALIGN_CENTRE)
+       
+       # the main window is composed of three areas stacked vertically:
+       # map window, player status icons, and chat windows.
+       # Use a Sizer to handle this geometry.
+-      self.mainSizer = wxBoxSizer(wxVERTICAL)
+-      self.mainSizer.Add(self.mapWindow, 1, wxEXPAND|wxBOTTOM, 5)
+-      self.mainSizer.Add(self.centerSizer, 0, wxALIGN_CENTRE)
+-      self.mainSizer.Add(self.chatWindow, 0, wxEXPAND | wxALL, 5)
+-
+-      self.panelSizer = wxBoxSizer(wxHORIZONTAL)
+-      self.panelSizer.Add(self.historyWin, 0, wxEXPAND)
+-      self.panelSizer.Add(self.mainSizer, 1, wxEXPAND)
++      self.mainSizer = wx.BoxSizer(wx.VERTICAL)
++      self.mainSizer.Add(self.mapWindow, 1, wx.EXPAND|wx.BOTTOM, 5)
++      self.mainSizer.Add(self.centerSizer, 0, wx.ALIGN_CENTRE)
++      self.mainSizer.Add(self.chatWindow, 0, wx.EXPAND | wx.ALL, 5)
++
++      self.panelSizer = wx.BoxSizer(wx.HORIZONTAL)
++      self.panelSizer.Add(self.historyWin, 0, wx.EXPAND)
++      self.panelSizer.Add(self.mainSizer, 1, wx.EXPAND)
+       
+       self.panel.SetSizer(self.panelSizer)
+ 
+-      self.topSizer = wxBoxSizer(wxVERTICAL)
+-      self.topSizer.Add(self.panel, 1, wxEXPAND)
++      self.topSizer = wx.BoxSizer(wx.VERTICAL)
++      self.topSizer.Add(self.panel, 1, wx.EXPAND)
+       self.SetSizer(self.topSizer)
+       self.topSizer.Fit(self)
+       self.SetAutoLayout(1)
+@@ -154,29 +154,29 @@ class MainWindow(wxFrame):
+ 
+       # need a data structure to hold a move from a MoveDialog
+       self.move = []
+-      self.moveDialogId  = wxNewId()
++      self.moveDialogId  = wx.NewId()
+ 
+       # initialize pixelToLoc algorithm
+       generateGridHash()
+ 
+       # make the buttons do some stuff
+-      EVT_CHECKBOX(self, self.zoomButton.GetId(), self.toggleZoom)
+-      EVT_CHECKBOX(self, self.historyButton.GetId(), self.toggleHistory)
+-      EVT_BUTTON(self, self.moveButton.GetId(), self.makeMove)
+-      EVT_TEXT_ENTER(self, self.chatWindow.chatEntry.GetId(), self.chatSend)
+-      EVT_MENU(self, self.EXIT, self.menuExit)
+-      EVT_MENU(self, self.DISCONNECT, self.menuDisconnect)
+-      EVT_MENU(self, self.FULLSCREEN, self.toggleFullscreen)
+-      EVT_MENU(self, self.ZOOM, self.toggleMenuZoom)
+-      EVT_MENU(self, self.HISTORY, self.toggleMenuHistory)
+-      EVT_MENU(self, self.ABOUT, self.showAbout)
+-      EVT_LEFT_DCLICK(self.icons.players[0].icon, self.scrollToPlayer0)
+-      EVT_LEFT_DCLICK(self.icons.players[1].icon, self.scrollToPlayer1)
+-      EVT_LEFT_DCLICK(self.icons.players[2].icon, self.scrollToPlayer2)
+-      EVT_LEFT_DCLICK(self.icons.players[3].icon, self.scrollToPlayer3)
+-      EVT_LEFT_DCLICK(self.icons.players[4].icon, self.scrollToPlayer4)
+-      EVT_LEFT_DCLICK(self.icons.players[5].icon, self.scrollToPlayer5)
+-      EVT_LEFT_DCLICK(self.mapWindow, self.moveToClicked)
++      wx.EVT_CHECKBOX(self, self.zoomButton.GetId(), self.toggleZoom)
++      wx.EVT_CHECKBOX(self, self.historyButton.GetId(), self.toggleHistory)
++      wx.EVT_BUTTON(self, self.moveButton.GetId(), self.makeMove)
++      wx.EVT_TEXT_ENTER(self, self.chatWindow.chatEntry.GetId(), self.chatSend)
++      wx.EVT_MENU(self, self.EXIT, self.menuExit)
++      wx.EVT_MENU(self, self.DISCONNECT, self.menuDisconnect)
++      wx.EVT_MENU(self, self.FULLSCREEN, self.toggleFullscreen)
++      wx.EVT_MENU(self, self.ZOOM, self.toggleMenuZoom)
++      wx.EVT_MENU(self, self.HISTORY, self.toggleMenuHistory)
++      wx.EVT_MENU(self, self.ABOUT, self.showAbout)
++      wx.EVT_LEFT_DCLICK(self.icons.players[0].icon, self.scrollToPlayer0)
++      wx.EVT_LEFT_DCLICK(self.icons.players[1].icon, self.scrollToPlayer1)
++      wx.EVT_LEFT_DCLICK(self.icons.players[2].icon, self.scrollToPlayer2)
++      wx.EVT_LEFT_DCLICK(self.icons.players[3].icon, self.scrollToPlayer3)
++      wx.EVT_LEFT_DCLICK(self.icons.players[4].icon, self.scrollToPlayer4)
++      wx.EVT_LEFT_DCLICK(self.icons.players[5].icon, self.scrollToPlayer5)
++      wx.EVT_LEFT_DCLICK(self.mapWindow, self.moveToClicked)
+       
+ 
+    def addChatMessage(self, chatType, data):
+@@ -187,17 +187,17 @@ class MainWindow(wxFrame):
+ 
+ 
+    def menuExit(self, event):
+-      alert = wxMessageDialog(self, "Disconnect from the server and exit London Law?",
+-         "Disconnect and Quit", wxYES_NO|wxICON_EXCLAMATION)
+-      if alert.ShowModal() == wxID_YES:
++      alert = wx.MessageDialog(self, "Disconnect from the server and exit London Law?",
++         "Disconnect and Quit", wx.YES_NO|wx.ICON_EXCLAMATION)
++      if alert.ShowModal() == wx.ID_YES:
+          self.messenger.netDisconnect()
+          self.Close()
+ 
+ 
+    def menuDisconnect(self, event):
+-      alert = wxMessageDialog(self, "Disconnect from the server?",
+-         "Disconnect", wxYES_NO|wxICON_EXCLAMATION)
+-      if alert.ShowModal() == wxID_YES:
++      alert = wx.MessageDialog(self, "Disconnect from the server?",
++         "Disconnect", wx.YES_NO|wx.ICON_EXCLAMATION)
++      if alert.ShowModal() == wx.ID_YES:
+          self.messenger.netDisconnect()
+          self.messenger.guiLaunchConnectionWindow()
+ 
+@@ -268,8 +268,8 @@ class MainWindow(wxFrame):
+ 
+       # pop up an alert box when X uses a double move
+       if mover == self.lastMover and not self.isMrX:
+-         alert = wxMessageDialog(self, "Mr. X just used a double move ticket!",
+-            "Double Move", wxOK|wxICON_INFORMATION)
++         alert = wx.MessageDialog(self, "Mr. X just used a double move ticket!",
++            "Double Move", wx.OK|wx.ICON_INFORMATION)
+          alert.ShowModal()
+ 
+       self.lastMover = mover
+@@ -320,17 +320,17 @@ class MainWindow(wxFrame):
+ 
+ 
+    def showInfoAlert(self, info):
+-      alert = wxMessageDialog(self, info,
+-         "Server Message", wxOK|wxICON_INFORMATION)
++      alert = wx.MessageDialog(self, info,
++         "Server Message", wx.OK|wx.ICON_INFORMATION)
+       alert.ShowModal()
+ 
+ 
+    def toggleZoom(self, event):
+       if self.zoomButton.GetValue():
+-         self.viewMenu.Check(self.ZOOM, true)
++         self.viewMenu.Check(self.ZOOM, True)
+          self.mapWindow.zoomIn()
+       else:
+-         self.viewMenu.Check(self.ZOOM, false)
++         self.viewMenu.Check(self.ZOOM, False)
+          self.mapWindow.zoomOut()
+ 
+ 
+@@ -341,17 +341,17 @@ class MainWindow(wxFrame):
+ 
+    def toggleHistory(self, event):
+       if self.historyButton.GetValue():
+-         self.viewMenu.Check(self.HISTORY, true)
+-         self.panelSizer.Prepend(self.historyWin, 0, wxEXPAND)
+-         self.historyWin.Show(true)
++         self.viewMenu.Check(self.HISTORY, True)
++         self.panelSizer.Prepend(self.historyWin, 0, wx.EXPAND)
++         self.historyWin.Show(True)
+          self.panelSizer.Layout()
+       else:
+-         self.viewMenu.Check(self.HISTORY, false)
+-         self.historyWin.Show(false)
+-         self.panelSizer.Remove(self.historyWin)
++         self.viewMenu.Check(self.HISTORY, False)
++         self.historyWin.Show(False)
++         self.panelSizer.Detach(self.historyWin)
+          self.panelSizer.Layout()
+ 
+-      # fix for graphical glitches in wxMSW
++      # fix for graphical glitches in wx.MSW
+       self.zoomButton.Refresh()
+       self.historyButton.Refresh()
+       self.moveButton.Refresh()
+@@ -365,8 +365,8 @@ class MainWindow(wxFrame):
+    def toggleFullscreen(self, event):
+       if not self.fullscreen:
+          self.fullscreen = 1
+-         self.viewMenu.Enable(self.HISTORY, false)
+-         self.viewMenu.Check(self.FULLSCREEN, true)
++         self.viewMenu.Enable(self.HISTORY, False)
++         self.viewMenu.Check(self.FULLSCREEN, True)
+          if self.historyButton.GetValue():
+             self.historyWin.Hide()
+             self.panelSizer.Remove(self.historyWin)
+@@ -386,34 +386,34 @@ class MainWindow(wxFrame):
+          self.panelSizer.Layout()
+       else:
+          self.fullscreen = 0
+-         self.viewMenu.Enable(self.HISTORY, true)
+-         self.viewMenu.Check(self.FULLSCREEN, false)
++         self.viewMenu.Enable(self.HISTORY, True)
++         self.viewMenu.Check(self.FULLSCREEN, False)
+          if self.historyButton.GetValue():
+             self.historyWin.Show()
+-            self.panelSizer.Prepend(self.historyWin, 0, wxEXPAND)
+-         self.buttonSizer = wxBoxSizer(wxVERTICAL)
+-         self.buttonSizer.Add(self.zoomButton, 0, wxALL, 5)
+-         self.buttonSizer.Add(self.historyButton, 0, wxALL, 5)
+-         self.buttonSizer.Add(self.moveButton, 0, wxALL, 5)
+-         self.centerSizer = wxBoxSizer(wxHORIZONTAL)
+-         self.centerSizer.Add(self.icons, 0, wxALIGN_CENTRE|wxALL)
+-         self.centerSizer.Add(self.buttonSizer, 0, wxALIGN_CENTRE)
+-         self.mainSizer.Add(self.centerSizer, 0, wxALIGN_CENTRE)
++            self.panelSizer.Prepend(self.historyWin, 0, wx.EXPAND)
++         self.buttonSizer = wx.BoxSizer(wx.VERTICAL)
++         self.buttonSizer.Add(self.zoomButton, 0, wx.ALL, 5)
++         self.buttonSizer.Add(self.historyButton, 0, wx.ALL, 5)
++         self.buttonSizer.Add(self.moveButton, 0, wx.ALL, 5)
++         self.centerSizer = wx.BoxSizer(wx.HORIZONTAL)
++         self.centerSizer.Add(self.icons, 0, wx.ALIGN_CENTRE|wx.ALL)
++         self.centerSizer.Add(self.buttonSizer, 0, wx.ALIGN_CENTRE)
++         self.mainSizer.Add(self.centerSizer, 0, wx.ALIGN_CENTRE)
+          self.icons.Show()
+          self.zoomButton.Show()
+          self.historyButton.Show()
+          self.moveButton.Show()
+          self.chatWindow.Show()
+-         self.mainSizer.Add(self.chatWindow, 0, wxEXPAND | wxALL, 5)
++         self.mainSizer.Add(self.chatWindow, 0, wx.EXPAND | wx.ALL, 5)
+          self.mainSizer.Layout()
+          self.panelSizer.Layout()
+ 
+ 
+    # display the About dialog
+    def showAbout(self, event):
+-      about = wxMessageDialog(self, "London Law v" + LLAW_VERSION + 
++      about = wx.MessageDialog(self, "London Law v" + LLAW_VERSION + 
+               "\n\nA multiplayer manhunting adventure by Paul Pelzl",
+-              "About London Law", wxOK|wxICON_INFORMATION)
++              "About London Law", wx.OK|wx.ICON_INFORMATION)
+       about.ShowModal()
+ 
+    def scrollToPlayer0(self, event):
+@@ -442,7 +442,7 @@ class MainWindow(wxFrame):
+    def setPawnTurn(self, pawnName):
+       if pawnName == "X":
+          if self.playerList[0][0] == self.username:
+-            self.moveButton.Enable(true)
++            self.moveButton.Enable(True)
+             usernameStr = "you"
+          else:
+             usernameStr = self.playerList[0][0]
+@@ -451,7 +451,7 @@ class MainWindow(wxFrame):
+          self.icons.setTurn(0)
+       elif pawnName == "Red":
+          if self.playerList[1][0] == self.username:
+-            self.moveButton.Enable(true)
++            self.moveButton.Enable(True)
+             usernameStr = "you"
+          else:
+             usernameStr = self.playerList[1][0]
+@@ -460,7 +460,7 @@ class MainWindow(wxFrame):
+          self.icons.setTurn(1)
+       elif pawnName == "Yellow":
+          if self.playerList[2][0] == self.username:
+-            self.moveButton.Enable(true)
++            self.moveButton.Enable(True)
+             usernameStr = "you"
+          else:
+             usernameStr = self.playerList[2][0]
+@@ -469,7 +469,7 @@ class MainWindow(wxFrame):
+          self.icons.setTurn(2)
+       elif pawnName == "Green":
+          if self.playerList[3][0] == self.username:
+-            self.moveButton.Enable(true)
++            self.moveButton.Enable(True)
+             usernameStr = "you"
+          else:
+             usernameStr = self.playerList[3][0]
+@@ -478,7 +478,7 @@ class MainWindow(wxFrame):
+          self.icons.setTurn(3)
+       elif pawnName == "Blue":
+          if self.playerList[4][0] == self.username:
+-            self.moveButton.Enable(true)
++            self.moveButton.Enable(True)
+             usernameStr = "you"
+          else:
+             usernameStr = self.playerList[4][0]
+@@ -487,7 +487,7 @@ class MainWindow(wxFrame):
+          self.icons.setTurn(4)
+       elif pawnName == "Black":
+          if self.playerList[5][0] == self.username:
+-            self.moveButton.Enable(true)
++            self.moveButton.Enable(True)
+             usernameStr = "you"
+          else:
+             usernameStr = self.playerList[5][0]
+@@ -511,7 +511,7 @@ class MainWindow(wxFrame):
+ #         if event[0] == "game socket":
+ #            self.socket = event[1]
+ #         elif event[0] == "created move":
+-#            self.moveButton.Enable(false)
++#            self.moveButton.Enable(False)
+ #         elif event[0] == "move dialog destroyed":
+ #            self.moveDialogExists = 0
+ #         elif event[0] == "incoming chat":
+@@ -547,14 +547,14 @@ class MainWindow(wxFrame):
+ #               self.status.PushStatusText("It is the Blue Detective's turn (you).", 0)
+ #            elif self.playerIdx == 5:
+ #               self.status.PushStatusText("It is the Black Detective's turn (you).", 0)
+-#            self.moveButton.Enable(true)
++#            self.moveButton.Enable(True)
+ #         elif event[0] == "move accepted":
+-#            self.moveButton.Enable(false)
++#            self.moveButton.Enable(False)
+ #         elif event[0] == "move rejected":
+-#            self.moveButton.Enable(true) # just in case
++#            self.moveButton.Enable(True) # just in case
+ #            self.status.PushStatusText("The server rejected your move.  It is still your turn.", 0)
+ #         elif event[0] == "double rejected":
+-#            self.moveButton.Enable(true) # just in case
++#            self.moveButton.Enable(True) # just in case
+ #            self.status.PushStatusText("The server rejected your double move.  It is still your turn.", 0) 
+ #         elif event[0] == "someone moved":
+ #            mover = event[1]
+@@ -661,16 +661,16 @@ class MainWindow(wxFrame):
+ #         elif event[0] == "x survived":
+ #            self.gameover = 1
+ #            self.status.PushStatusText("Mr. X survived!  Game over.", 0)
+-#            alert = wxMessageDialog(self, "Mr. X successfully evaded the detectives!\nGame over.",
+-#               "Game Over", wxOK|wxICON_INFORMATION)
++#            alert = wx.MessageDialog(self, "Mr. X successfully evaded the detectives!\nGame over.",
++#               "Game Over", wx.OK|wx.ICON_INFORMATION)
+ #            alert.ShowModal()
+ #         elif event[0] == "detectives all stuck":
+ #            for i in range(1, 6):
+ #               self.icons.setStuck(i)
+ #            self.gameover = 1
+ #            self.status.PushStatusText("The detectives are all stuck!  Game over.", 0)
+-#            alert = wxMessageDialog(self, "The detectives are all stuck!\nMr. X makes a clean getaway.  Game over.",
+-#               "Game Over", wxOK|wxICON_INFORMATION)
++#            alert = wx.MessageDialog(self, "The detectives are all stuck!\nMr. X makes a clean getaway.  Game over.",
++#               "Game Over", wx.OK|wx.ICON_INFORMATION)
+ #            alert.ShowModal()
+ #         elif event[0] == "x is caught":
+ #            self.gameover = 1
+@@ -685,12 +685,12 @@ class MainWindow(wxFrame):
+ #            elif event[1] == 5:
+ #               detstr = "the Black Detective"
+ #            self.status.PushStatusText("Mr. X was caught by "+detstr+" at "+`event[2]`+".  The detectives win!", 0)
+-#            alert = wxMessageDialog(self, "Mr. X was caught by "+detstr+" at "+`event[2]`+
+-#               ".  The detectives win!\nGame over.", "Game Over", wxOK|wxICON_INFORMATION)
++#            alert = wx.MessageDialog(self, "Mr. X was caught by "+detstr+" at "+`event[2]`+
++#               ".  The detectives win!\nGame over.", "Game Over", wx.OK|wx.ICON_INFORMATION)
+ #            alert.ShowModal()
+ #         elif event[0] == "connection error":
+-#            alert = wxMessageDialog(self, "The server reports that the connection to "+`event[1]`+" was lost.\n" +
+-#               "The game will end.", "Connection Error", wxOK|wxICON_INFORMATION)
++#            alert = wx.MessageDialog(self, "The server reports that the connection to "+`event[1]`+" was lost.\n" +
++#               "The game will end.", "Connection Error", wx.OK|wx.ICON_INFORMATION)
+ #            alert.ShowModal()
+ #            self.disconnecting = 1
+ #            # FIXME: need a little more here... disable some widgets and so forth
+@@ -703,8 +703,8 @@ class MainWindow(wxFrame):
+ #               self.status.PushStatusText("Disconnected from server.", 0)
+ #               # FIXME: need a little more here... disable some widgets and so forth
+ #            elif not self.gameover:
+-#               alert = wxMessageDialog(self, "The connection to the server was lost.\nThe game will end.",
+-#                  "Connection Error", wxOK|wxICON_ERROR)
++#               alert = wx.MessageDialog(self, "The connection to the server was lost.\nThe game will end.",
++#                  "Connection Error", wx.OK|wx.ICON_ERROR)
+ #               alert.ShowModal()
+ #               # FIXME: need a little more here... disable some widgets and so forth
+ #         elif event[0] == "replay turn":
+Index: londonlaw-0.2.1/londonlaw/guiclient/MapWindow.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/MapWindow.py
++++ londonlaw-0.2.1/londonlaw/guiclient/MapWindow.py
+@@ -24,7 +24,7 @@
+ # to launch a MoveDialog.
+ 
+ 
+-from wxPython.wx import *
++import wx
+ from TextPanel import *
+ from graphicalmap import *
+ from londonlaw.common.config import *
+@@ -34,18 +34,18 @@ import os
+ PlayerNumError = "Player Number Error"
+ 
+ 
+-class MapWindow(wxScrolledWindow):
++class MapWindow(wx.ScrolledWindow):
+    def __init__(self, parent, usernameList):
+-      wxScrolledWindow.__init__(self, parent)
++      wx.ScrolledWindow.__init__(self, parent)
+ 
+       # load the map image and prepare a DC for it
+       mapImageFile   = os.path.normpath(os.path.join(MEDIAROOT, "images/map.jpg"))
+-      mapImage       = wxImage(mapImageFile, wxBITMAP_TYPE_JPEG)
+-      self.mapBitmap = wxBitmapFromImage(mapImage)
+-      self.bmpDC     = wxMemoryDC()
++      mapImage       = wx.Image(mapImageFile, wx.BITMAP_TYPE_JPEG)
++      self.mapBitmap = wx.BitmapFromImage(mapImage)
++      self.bmpDC     = wx.MemoryDC()
+       mapImageFile        = os.path.normpath(os.path.join(MEDIAROOT, "images/map-quarter.jpg"))
+-      mapImage            = wxImage(mapImageFile, wxBITMAP_TYPE_JPEG)
+-      self.mapBitmapSmall = wxBitmapFromImage(mapImage)
++      mapImage            = wx.Image(mapImageFile, wx.BITMAP_TYPE_JPEG)
++      self.mapBitmapSmall = wx.BitmapFromImage(mapImage)
+       self.bmpDC.SelectObject(self.mapBitmapSmall)
+ 
+       self.zoomLevel = 2
+@@ -56,13 +56,13 @@ class MapWindow(wxScrolledWindow):
+       self.SetVirtualSize((self.mapBitmapSmall.GetWidth(), self.mapBitmapSmall.GetHeight()))
+       self.SetScrollRate(10, 10)
+ 
+-      self.maskColour = wxColour(10,10,10)
+-      self.pen        = wxPen(wxBLACK, 3, wxSOLID)
+-      self.brush      = wxBrush(wxWHITE, wxSOLID)
+-      self.bgBrush    = wxBrush(self.maskColour, wxSOLID)
+-      self.pushpinDC  = wxMemoryDC()
++      self.maskColour = wx.Colour(10,10,10)
++      self.pen        = wx.Pen(wx.BLACK, 3, wx.SOLID)
++      self.brush      = wx.Brush(wx.WHITE, wx.SOLID)
++      self.bgBrush    = wx.Brush(self.maskColour, wx.SOLID)
++      self.pushpinDC  = wx.MemoryDC()
+ 
+-      self.labelsShown = false
++      self.labelsShown = False
+ 
+       self.playerLoc          = []
+       self.pushpins           = []
+@@ -72,33 +72,33 @@ class MapWindow(wxScrolledWindow):
+       for i in range(6):
+          self.playerLoc.append(0)
+          filename     = os.path.normpath(os.path.join(MEDIAROOT, "images/pin" + str(i) + ".png"))
+-         pushpinImage = wxImage(filename, wxBITMAP_TYPE_ANY)
++         pushpinImage = wx.Image(filename, wx.BITMAP_TYPE_ANY)
+          pushpinImage.SetMaskColour(255, 0, 242) # the purplish colour is not to be drawn
+-         pushpinBitmap  = wxBitmapFromImage(pushpinImage)
++         pushpinBitmap  = wx.BitmapFromImage(pushpinImage)
+          self.pushpins.append(pushpinBitmap)
+-         pushpinBackBmp = wxEmptyBitmap(pushpinBitmap.GetWidth(), pushpinBitmap.GetHeight(), -1)
++         pushpinBackBmp = wx.EmptyBitmap(pushpinBitmap.GetWidth(), pushpinBitmap.GetHeight(), -1)
+          self.pushpinBackgrounds.append(pushpinBackBmp)
+-         self.labels.append(TextPanel(self, " " + usernameList[i][:20] + " ", 10, wxSIMPLE_BORDER))
++         self.labels.append(TextPanel(self, " " + usernameList[i][:20] + " ", 10, wx.SIMPLE_BORDER))
+          self.labels[i].Hide()
+-         self.labels[i].SetBackgroundColour(wxColour(220, 220, 220))
++         self.labels[i].SetBackgroundColour(wx.Colour(220, 220, 220))
+ 
+ 
+-      EVT_PAINT(self, self.OnPaint)
+-      EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
++      wx.EVT_PAINT(self, self.OnPaint)
++      wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
+       # scroll the map on middle or right button drag
+-      EVT_MIDDLE_DOWN(self, self.handleMiddleOrRightMouse)
+-      EVT_RIGHT_DOWN(self, self.handleMiddleOrRightMouse)
+-      EVT_MOTION(self, self.handleMoveMouse)
++      wx.EVT_MIDDLE_DOWN(self, self.handleMiddleOrRightMouse)
++      wx.EVT_RIGHT_DOWN(self, self.handleMiddleOrRightMouse)
++      wx.EVT_MOTION(self, self.handleMoveMouse)
+ 
+ 
+    def OnPaint(self, event):
+-      dc = wxPaintDC(self)
++      dc = wx.PaintDC(self)
+       self.PrepareDC(dc)
+       self.OnDraw(dc)
+ 
+ 
+    # try to eliminate flicker from painting the window background.
+-   # (why doesn't this work in wxGTK?)
++   # (why doesn't this work in wx.GTK?)
+    def OnEraseBackground(self, event):
+       pass
+ 
+@@ -114,7 +114,7 @@ class MapWindow(wxScrolledWindow):
+       newX, newY   = event.GetPosition()
+       stepX, stepY = self.GetScrollPixelsPerUnit()
+       sX, sY       = self.GetViewStart()
+-      if (event.m_rightDown or event.m_middleDown) and event.Dragging():
++      if (event.rightIsDown or event.middleIsDown) and event.Dragging():
+          pixelDX = newX - self.oldX
+          pixelDY = newY - self.oldY
+          dx = pixelDX / stepX
+@@ -130,10 +130,10 @@ class MapWindow(wxScrolledWindow):
+                if loc == self.playerLoc[i]:
+                   self.labels[i].Show()
+                   self.labels[i].Raise()
+-                  self.labelsShown = true
++                  self.labelsShown = True
+                   break
+          elif self.labelsShown:
+-            self.labelsShown = false
++            self.labelsShown = False
+             for i in range(6):
+                self.labels[i].Hide()
+ 
+@@ -203,7 +203,7 @@ class MapWindow(wxScrolledWindow):
+       self.pushpinDC.BeginDrawing()
+       self.bmpDC.Blit(mapPixel[0]-self.pushpinOffset[0], mapPixel[1]-self.pushpinOffset[1], 
+             self.pushpinBackgrounds[playerNum].GetWidth(),
+-            self.pushpinBackgrounds[playerNum].GetHeight(), self.pushpinDC, 0, 0, wxCOPY, TRUE)
++            self.pushpinBackgrounds[playerNum].GetHeight(), self.pushpinDC, 0, 0, wx.COPY, True)
+       self.pushpinDC.EndDrawing()
+ 
+ 
+@@ -256,7 +256,7 @@ class MapWindow(wxScrolledWindow):
+          sX, sY       = self.GetViewStart()
+          self.labels[i].MoveXY(mapPixel[0] - 20 - sX*stepX, mapPixel[1] - 10 - sY*stepY)
+ 
+-      self.Refresh(FALSE)
++      self.Refresh(False)
+ 
+       
+    # switch to zoom level 2
+@@ -290,7 +290,7 @@ class MapWindow(wxScrolledWindow):
+          sX, sY       = self.GetViewStart()
+          self.labels[i].MoveXY(mapPixel[0] - 20 - sX*stepX, mapPixel[1] - 10 - sY*stepY)
+ 
+-      self.Refresh(FALSE)
++      self.Refresh(False)
+ 
+ 
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/MoveDialog.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/MoveDialog.py
++++ londonlaw-0.2.1/londonlaw/guiclient/MoveDialog.py
+@@ -19,7 +19,7 @@
+ 
+ # MoveDialog.py
+ #
+-# This class generates a wxDialog that is used to choose a move (or double move).
++# This class generates a wx.Dialog that is used to choose a move (or double move).
+ # Drop-down boxes allow the player to choose from the possible moves.  The code
+ # is rather lengthy because the MoveDialog validates itself on-the-fly: that is,
+ # the transportation drop-down box always shows only transports that are available
+@@ -28,21 +28,21 @@
+ # FIXME: this appears to be correct, but needs some major cleanup.  Maybe some portions
+ #        can be factored better into functions.
+ 
+-from wxPython.wx import *
++import wx
+ from londonlaw.common.map import *
+ 
+ 
+ 
+-DIALOGDESTROYED = wxNewEventType() 
++DIALOGDESTROYED = wx.NewEventType() 
+  
+ def EVT_DIALOGDESTROYED(window, function): 
+     """Your documentation here""" 
+     window.Connect(-1, -1, DIALOGDESTROYED, function)
+  
+-class DialogDestroyedEvent(wxPyCommandEvent): 
++class DialogDestroyedEvent(wx.PyCommandEvent): 
+     eventType = DIALOGDESTROYED
+     def __init__(self, windowID): 
+-        wxPyCommandEvent.__init__(self, self.eventType, windowID) 
++        wx.PyCommandEvent.__init__(self, self.eventType, windowID) 
+  
+     def Clone(self): 
+         self.__class__(self.GetId()) 
+@@ -50,19 +50,19 @@ class DialogDestroyedEvent(wxPyCommandEv
+ 
+ 
+ 
+-class MoveDialog(wxDialog):
++class MoveDialog(wx.Dialog):
+    # currPos is an integer indicating the current player position
+    # destPos is a first choice destination, which the player probably
+    #    chose by clicking on a map location
+    # players is a list of locations and tokens for all players
+    # playerIdx is the index if this player in that list
+    # Use EVT_GOT_MOVE to catch the return values (insert derogatory comment about
+-   #    lack of flexibility in return values for wxDialog::EndModal())
++   #    lack of flexibility in return values for wx.Dialog::EndModal())
+    def __init__(self, parent, ID, destPos, playerList, playerIdx, messenger):
+-      wxDialog.__init__(self, parent, ID, "Choose a Move")
++      wx.Dialog.__init__(self, parent, ID, "Choose a Move")
+       self.parent = parent
+ 
+-      self.panel = wxPanel(self, -1)
++      self.panel = wx.Panel(self, -1)
+ 
+       self.playerIdx  = playerIdx
+       self.playerList = playerList
+@@ -71,41 +71,41 @@ class MoveDialog(wxDialog):
+ 
+       # Mr. X gets the option of a double move
+       if self.playerIdx == 0:
+-         self.moveType = wxRadioBox(self.panel, -1, "move type: ", wxDefaultPosition, wxDefaultSize,
+-            ["Single", "Double"], 1, wxRA_SPECIFY_ROWS)
++         self.moveType = wx.RadioBox(self.panel, -1, "move type: ", wx.DefaultPosition, wx.DefaultSize,
++            ["Single", "Double"], 1, wx.RA_SPECIFY_ROWS)
+          # If he has no double move tokens, then it's disabled
+          if self.playerList[self.playerIdx][2][4] < 1:
+-            self.moveType.Enable(false)
++            self.moveType.Enable(False)
+       
+-      self.pos1Label = wxStaticText(self.panel, -1, "Move from "+`self.currPos`+" to ", wxPoint(0,0))
+-      self.trans1Label = wxStaticText(self.panel, -1, " using ", wxPoint(0,0))
++      self.pos1Label = wx.StaticText(self.panel, -1, "Move from "+`self.currPos`+" to ", wx.Point(0,0))
++      self.trans1Label = wx.StaticText(self.panel, -1, " using ", wx.Point(0,0))
+ 
+       self.moves, self.movesStr = self.getAvailMoves(self.currPos, self.playerList, self.playerIdx)
+-      self.dest1Box = wxChoice(self.panel, -1, wxDefaultPosition, wxDefaultSize, self.movesStr)
++      self.dest1Box = wx.Choice(self.panel, -1, wx.DefaultPosition, wx.DefaultSize, self.movesStr)
+       self.dest1Box.SetSelection(0)
+       if destPos in self.moves:
+-         self.Show(TRUE)
++         self.Show(True)
+          for i in range(len(self.moves)):
+             if self.moves[i] == destPos:
+                self.dest1Box.SetSelection(i)
+                break
+       else:
+-         self.Show(FALSE)
++         self.Show(False)
+          if destPos != 0:
+             self.drawMoveErrorDialog()
+       
+ 
+-      self.trans1ID = wxNewId()
++      self.trans1ID = wx.NewId()
+       self.trans, self.transStr = self.getAvailTransports(self.currPos, self.moves[self.dest1Box.GetSelection()],
+          self.playerList[self.playerIdx][2], self.playerIdx)
+-      self.trans1Box = wxChoice(self.panel, self.trans1ID, wxDefaultPosition, wxDefaultSize, self.transStr)
++      self.trans1Box = wx.Choice(self.panel, self.trans1ID, wx.DefaultPosition, wx.DefaultSize, self.transStr)
+       self.trans1Box.SetSelection(0)
+ 
+ 
+       # double move options
+       if self.playerIdx == 0:
+-         self.pos2Label = wxStaticText(self.panel, -1, "Move from "+self.dest1Box.GetStringSelection()+" to ", wxPoint(0,0))
+-         self.trans2Label = wxStaticText(self.panel, -1, " using ", wxPoint(0,0))
++         self.pos2Label = wx.StaticText(self.panel, -1, "Move from "+self.dest1Box.GetStringSelection()+" to ", wx.Point(0,0))
++         self.trans2Label = wx.StaticText(self.panel, -1, " using ", wx.Point(0,0))
+ 
+          # create a new playerList that has an updated location and list of tokens for Mr. X, assuming
+          # that the first leg of the double move is complete.  This new list is required to figure out
+@@ -123,79 +123,79 @@ class MoveDialog(wxDialog):
+          for i in range(1, len(self.playerList)):
+             pl2.append(self.playerList[i])
+ 
+-         self.dest2ID = wxNewId()
++         self.dest2ID = wx.NewId()
+          self.moves2, self.moves2Str = self.getAvailMoves(self.moves[self.dest1Box.GetSelection()], pl2, 0)
+-         self.dest2Box = wxChoice(self.panel, self.dest2ID, wxDefaultPosition, wxDefaultSize, self.moves2Str)
++         self.dest2Box = wx.Choice(self.panel, self.dest2ID, wx.DefaultPosition, wx.DefaultSize, self.moves2Str)
+          self.dest2Box.SetSelection(0)
+ 
+-         self.trans2ID = wxNewId()
++         self.trans2ID = wx.NewId()
+          self.trans2, self.trans2Str = self.getAvailTransports(self.moves[self.dest1Box.GetSelection()],
+             self.moves2[self.dest2Box.GetSelection()], pl2[0][2], 0)
+-         self.trans2Box = wxChoice(self.panel, self.trans2ID, wxDefaultPosition, wxDefaultSize, self.trans2Str)
++         self.trans2Box = wx.Choice(self.panel, self.trans2ID, wx.DefaultPosition, wx.DefaultSize, self.trans2Str)
+          self.trans2Box.SetSelection(0)
+ 
+-         self.move2Sizer = wxBoxSizer(wxHORIZONTAL)
+-         self.move2Sizer.Add(self.pos2Label, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
+-         self.move2Sizer.Add(self.dest2Box, 0, wxALIGN_CENTRE | wxALL, 5)
+-         self.move2Sizer.Add(self.trans2Label, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
+-         self.move2Sizer.Add(self.trans2Box, 0, wxALIGN_CENTRE | wxALL, 5)
+-
+-         labelFont = wxFont(self.GetFont().GetPointSize(), wxDEFAULT, wxNORMAL, wxBOLD)
+-         labelFont.SetWeight(wxBOLD)
+-         self.move1Label = wxStaticText(self.panel, -1, "Move One:")
+-         self.move2Label = wxStaticText(self.panel, -1, "Move Two:") 
++         self.move2Sizer = wx.BoxSizer(wx.HORIZONTAL)
++         self.move2Sizer.Add(self.pos2Label, 0, wx.ALIGN_CENTRE | wx.ALL | wx.ADJUST_MINSIZE, 5)
++         self.move2Sizer.Add(self.dest2Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++         self.move2Sizer.Add(self.trans2Label, 0, wx.ALIGN_CENTRE | wx.ALL | wx.ADJUST_MINSIZE, 5)
++         self.move2Sizer.Add(self.trans2Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++
++         labelFont = wx.Font(self.GetFont().GetPointSize(), wx.DEFAULT, wx.NORMAL, wx.BOLD)
++         labelFont.SetWeight(wx.BOLD)
++         self.move1Label = wx.StaticText(self.panel, -1, "Move One:")
++         self.move2Label = wx.StaticText(self.panel, -1, "Move Two:") 
+          self.move1Label.SetFont(labelFont)
+          self.move2Label.SetFont(labelFont)
+ 
+          if self.playerIdx == 0:
+-            self.move2Label.Enable(false)
+-         self.pos2Label.Enable(false)
+-         self.trans2Label.Enable(false)
+-         self.dest2Box.Enable(false)
+-         self.trans2Box.Enable(false)
+-
+-
+-      okButton = wxButton(self.panel, wxID_OK, "OK")
+-      cancelButton = wxButton(self.panel, wxID_CANCEL, "Cancel")
+-
+-      self.move1Sizer = wxBoxSizer(wxHORIZONTAL)
+-      self.move1Sizer.Add(self.pos1Label, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
+-      self.move1Sizer.Add(self.dest1Box, 0, wxALIGN_CENTRE | wxALL, 5)
+-      self.move1Sizer.Add(self.trans1Label, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
+-      self.move1Sizer.Add(self.trans1Box, 0, wxALIGN_CENTRE | wxALL, 5)
+-
+-      buttonSizer = wxBoxSizer(wxHORIZONTAL)
+-      buttonSizer.Add(cancelButton, 0, wxALIGN_CENTRE | wxALL, 5)
+-      buttonSizer.Add(okButton, 0, wxALIGN_CENTRE | wxALL, 5)
++            self.move2Label.Enable(False)
++         self.pos2Label.Enable(False)
++         self.trans2Label.Enable(False)
++         self.dest2Box.Enable(False)
++         self.trans2Box.Enable(False)
++
++
++      okButton = wx.Button(self.panel, wx.ID_OK, "OK")
++      cancelButton = wx.Button(self.panel, wx.ID_CANCEL, "Cancel")
++
++      self.move1Sizer = wx.BoxSizer(wx.HORIZONTAL)
++      self.move1Sizer.Add(self.pos1Label, 0, wx.ALIGN_CENTRE | wx.ALL | wx.ADJUST_MINSIZE, 5)
++      self.move1Sizer.Add(self.dest1Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++      self.move1Sizer.Add(self.trans1Label, 0, wx.ALIGN_CENTRE | wx.ALL | wx.ADJUST_MINSIZE, 5)
++      self.move1Sizer.Add(self.trans1Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++
++      buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
++      buttonSizer.Add(cancelButton, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++      buttonSizer.Add(okButton, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+ 
+-      self.pSizer = wxBoxSizer(wxVERTICAL)
++      self.pSizer = wx.BoxSizer(wx.VERTICAL)
+       if self.playerIdx == 0:
+-         self.pSizer.Add(self.moveType, 0, wxALIGN_CENTRE | wxALL, 5)
+-         self.pSizer.Add(self.move1Label, 0, wxALIGN_LEFT | wxLEFT | wxTOP, 5)
++         self.pSizer.Add(self.moveType, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
++         self.pSizer.Add(self.move1Label, 0, wx.ALIGN_LEFT | wx.LEFT | wx.TOP, 5)
+          self.move1Sizer.Prepend((10,1),0,0)
+-      self.pSizer.Add(self.move1Sizer, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
++      self.pSizer.Add(self.move1Sizer, 0, wx.ALIGN_CENTRE | wx.ALL | wx.ADJUST_MINSIZE, 5)
+       if self.playerIdx == 0:
+-         self.pSizer.Add(self.move2Label, 0, wxALIGN_LEFT | wxLEFT | wxTOP, 5)
++         self.pSizer.Add(self.move2Label, 0, wx.ALIGN_LEFT | wx.LEFT | wx.TOP, 5)
+          self.move2Sizer.Prepend((10,1),0,0)
+-         self.pSizer.Add(self.move2Sizer, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
+-      self.pSizer.Add(buttonSizer, 0, wxALIGN_RIGHT | wxALL, 5)
++         self.pSizer.Add(self.move2Sizer, 0, wx.ALIGN_CENTRE | wx.ALL | wx.ADJUST_MINSIZE, 5)
++      self.pSizer.Add(buttonSizer, 0, wx.ALIGN_RIGHT | wx.ALL, 5)
+ 
+       self.panel.SetSizer(self.pSizer)
+       self.pSizer.Fit(self.panel)
+-      self.sizer = wxBoxSizer(wxVERTICAL)
+-      self.sizer.Add(self.panel, 1, wxEXPAND | wxALL | wxADJUST_MINSIZE, 5)
++      self.sizer = wx.BoxSizer(wx.VERTICAL)
++      self.sizer.Add(self.panel, 1, wx.EXPAND | wx.ALL | wx.ADJUST_MINSIZE, 5)
+       self.SetSizer(self.sizer)
+       self.sizer.Fit(self)
+       self.SetAutoLayout(1)
+ 
+       self.dest1Box.SetFocus()
+ 
+-      EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
+-      EVT_BUTTON(self, wxID_OK, self.OnOK)
+-      EVT_CHOICE(self, self.dest1Box.GetId(), self.updateTrans1)
++      wx.EVT_BUTTON(self, wx.ID_CANCEL, self.OnCancel)
++      wx.EVT_BUTTON(self, wx.ID_OK, self.OnOK)
++      wx.EVT_CHOICE(self, self.dest1Box.GetId(), self.updateTrans1)
+       if self.playerIdx == 0:
+-         EVT_CHOICE(self, self.dest2Box.GetId(), self.updateTrans2Evt)
+-         EVT_RADIOBOX(self, self.moveType.GetId(), self.updateDouble)
++         wx.EVT_CHOICE(self, self.dest2Box.GetId(), self.updateTrans2Evt)
++         wx.EVT_RADIOBOX(self, self.moveType.GetId(), self.updateDouble)
+ 
+ 
+    def drawMoveErrorDialog(self):
+@@ -211,13 +211,13 @@ class MoveDialog(wxDialog):
+          prefix = "The Blue Detective"
+       elif self.playerIdx == 5:
+          prefix = "The Black Detective"
+-      alert = wxMessageDialog(self.parent, prefix + " can't move to that location.", "Illegal Move", wxOK|wxICON_ERROR)
++      alert = wx.MessageDialog(self.parent, prefix + " can't move to that location.", "Illegal Move", wx.OK|wx.ICON_ERROR)
+       alert.ShowModal()
+ 
+ 
+    def setDest1(self, destPos):
+       if destPos in self.moves:
+-         self.Show(TRUE)
++         self.Show(True)
+          for i in range(len(self.moves)):
+             if self.moves[i] == destPos:
+                self.dest1Box.SetSelection(i)
+@@ -229,17 +229,17 @@ class MoveDialog(wxDialog):
+ 
+    def updateDouble(self, event):
+       if self.moveType.GetSelection() == 0:
+-         self.move2Label.Enable(false)
+-         self.pos2Label.Enable(false)
+-         self.trans2Label.Enable(false)
+-         self.dest2Box.Enable(false)
+-         self.trans2Box.Enable(false)
++         self.move2Label.Enable(False)
++         self.pos2Label.Enable(False)
++         self.trans2Label.Enable(False)
++         self.dest2Box.Enable(False)
++         self.trans2Box.Enable(False)
+       else:
+-         self.move2Label.Enable(true) 
+-         self.pos2Label.Enable(true)
+-         self.trans2Label.Enable(true)
+-         self.dest2Box.Enable(true)
+-         self.trans2Box.Enable(true)
++         self.move2Label.Enable(True) 
++         self.pos2Label.Enable(True)
++         self.trans2Label.Enable(True)
++         self.dest2Box.Enable(True)
++         self.trans2Box.Enable(True)
+ 
+ 
+ 
+@@ -250,9 +250,9 @@ class MoveDialog(wxDialog):
+          self.playerList[self.playerIdx][2], self.playerIdx)
+       self.move1Sizer.Remove(self.trans1Box)
+       self.trans1Box.Destroy()
+-      self.trans1Box = wxChoice(self.panel, self.trans1ID, wxDefaultPosition, wxDefaultSize, self.transStr)
++      self.trans1Box = wx.Choice(self.panel, self.trans1ID, wx.DefaultPosition, wx.DefaultSize, self.transStr)
+       self.trans1Box.SetSelection(0)
+-      self.move1Sizer.Add(self.trans1Box, 0, wxALIGN_CENTRE | wxALL, 5)
++      self.move1Sizer.Add(self.trans1Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+       self.move1Sizer.Layout()
+       self.updateDest2()
+ 
+@@ -280,15 +280,13 @@ class MoveDialog(wxDialog):
+             pl2.append(self.playerList[i])
+ 
+          self.moves2, self.moves2Str = self.getAvailMoves(self.moves[self.dest1Box.GetSelection()], pl2, 0)
+-         self.move2Sizer.Remove(self.pos2Label)
+-         self.move2Sizer.Remove(self.dest2Box)
++         self.move2Sizer.Detach(self.dest2Box)
+          self.dest2Box.Destroy()
+-         self.dest2Box = wxChoice(self.panel, self.dest2ID, wxDefaultPosition, wxDefaultSize, self.moves2Str)
++         self.dest2Box = wx.Choice(self.panel, self.dest2ID, wx.DefaultPosition, wx.DefaultSize, self.moves2Str)
+          self.dest2Box.SetSelection(0)
+          if self.moveType.GetSelection() == 0:
+-            self.dest2Box.Enable(false)
+-         self.move2Sizer.Prepend(self.dest2Box, 0, wxALIGN_CENTRE | wxALL, 5)
+-         self.move2Sizer.Prepend(self.pos2Label, 0, wxALIGN_CENTRE | wxALL | wxADJUST_MINSIZE, 5)
++            self.dest2Box.Enable(False)
++         self.move2Sizer.Insert(2, self.dest2Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+          self.updateTrans2()
+       else:
+          self.sizer.Layout()
+@@ -307,11 +305,11 @@ class MoveDialog(wxDialog):
+          self.moves2[self.dest2Box.GetSelection()], xtokens, 0)
+       self.move2Sizer.Remove(self.trans2Box)
+       self.trans2Box.Destroy()
+-      self.trans2Box = wxChoice(self.panel, self.trans2ID, wxDefaultPosition, wxDefaultSize, self.trans2Str)
++      self.trans2Box = wx.Choice(self.panel, self.trans2ID, wx.DefaultPosition, wx.DefaultSize, self.trans2Str)
+       self.trans2Box.SetSelection(0)
+       if self.moveType.GetSelection() == 0:
+-         self.trans2Box.Enable(false)
+-      self.move2Sizer.Add(self.trans2Box, 0, wxALIGN_CENTRE | wxALL, 5)
++         self.trans2Box.Enable(False)
++      self.move2Sizer.Add(self.trans2Box, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+       self.move2Sizer.Layout()
+       self.sizer.Layout()
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/PlayerIcon.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/PlayerIcon.py
++++ londonlaw-0.2.1/londonlaw/guiclient/PlayerIcon.py
+@@ -23,7 +23,7 @@
+ # There are captions for names and readouts of the available tokens.
+ # Status icons can be overlaid on the player icons to show whose turn it is, etc.
+ 
+-from wxPython.wx import *
++import wx
+ from TextPanel import *
+ from StaticBitmap import *
+ from londonlaw.common.config import *
+@@ -34,82 +34,82 @@ import os
+ # readout of the available tokens.
+ # expects a list of three tokens (taxi, bus, undergnd) or a list of five
+ # tokens (taxi, bus, undergnd, black, double)
+-class PlayerIcon(wxPanel):
++class PlayerIcon(wx.Panel):
+    def __init__(self, parent, imagefile, thinkingimagefile, stuckimagefile, 
+             name, tokenList, isMrX = False):
+-      wxPanel.__init__(self, parent, -1) #wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER)
++      wx.Panel.__init__(self, parent, -1) #wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER)
+ 
+-      self.iconPanel = wxPanel(self, -1)
++      self.iconPanel = wx.Panel(self, -1)
+       self.isStuck   = False
+       self.isMrX     = isMrX
+ 
+       # load the image
+-      iconImage = wxImage(imagefile, wxBITMAP_TYPE_ANY)
++      iconImage = wx.Image(imagefile, wx.BITMAP_TYPE_ANY)
+       # we need an extra copy of the player icon, so we can blit to one of them in memory
+-      self.playerBitmap = wxBitmapFromImage(iconImage)
+-      self.iconBitmap   = wxBitmapFromImage(iconImage)
+-      self.iconBitmap2  = wxBitmapFromImage(iconImage)
++      self.playerBitmap = wx.BitmapFromImage(iconImage)
++      self.iconBitmap   = wx.BitmapFromImage(iconImage)
++      self.iconBitmap2  = wx.BitmapFromImage(iconImage)
+       self.icon = StaticBitmap(self.iconPanel, -1, self.iconBitmap)
+ 
+       # load the overlay image for the "I'm thinking" question mark
+-      thinkingImage = wxImage(thinkingimagefile, wxBITMAP_TYPE_ANY)
++      thinkingImage = wx.Image(thinkingimagefile, wx.BITMAP_TYPE_ANY)
+       thinkingImage.SetMaskColour(255, 0, 242) # the purplish colour is not to be drawn
+-      self.thinkingBitmap = wxBitmapFromImage(thinkingImage)
++      self.thinkingBitmap = wx.BitmapFromImage(thinkingImage)
+ 
+       # load the overlay image for the "I'm stuck" stop sign
+-      stuckImage = wxImage(stuckimagefile, wxBITMAP_TYPE_ANY)
++      stuckImage = wx.Image(stuckimagefile, wx.BITMAP_TYPE_ANY)
+       stuckImage.SetMaskColour(255, 0, 242) # the purplish colour is not to be drawn
+-      self.stuckBitmap = wxBitmapFromImage(stuckImage)
++      self.stuckBitmap = wx.BitmapFromImage(stuckImage)
+ 
+-      iconSizer = wxBoxSizer(wxVERTICAL)
+-      iconSizer.Add(self.icon, 0, wxADJUST_MINSIZE)
++      iconSizer = wx.BoxSizer(wx.VERTICAL)
++      iconSizer.Add(self.icon, 0, wx.ADJUST_MINSIZE)
+       self.iconPanel.SetSizer(iconSizer)
+       iconSizer.Fit(self.iconPanel)
+ 
+ 
+       # create the caption
+-      self.caption = TextPanel(self, " "+name[:20]+" ", 10, wxSIMPLE_BORDER)#|wxALIGN_CENTRE
++      self.caption = TextPanel(self, " "+name[:20]+" ", 10, wx.SIMPLE_BORDER)#|wx.ALIGN_CENTRE
+ 
+       # create the inventory labels
+       if self.isMrX:
+-         self.blackLabel = TextPanel(self, " "+`tokenList[3]`+" ", 10, wxEXPAND)
+-         self.blackLabel.SetBackgroundColour(wxColour(0,0,0))
+-         self.blackLabel.SetForegroundColour(wxColour(255,255,255))
+-         self.doubleLabel = TextPanel(self, " "+`tokenList[4]`+" ", 10, wxEXPAND)
+-         self.doubleLabel.SetBackgroundColour(wxColour(255,84,166))
++         self.blackLabel = TextPanel(self, " "+`tokenList[3]`+" ", 10, wx.EXPAND)
++         self.blackLabel.SetBackgroundColour(wx.Colour(0,0,0))
++         self.blackLabel.SetForegroundColour(wx.Colour(255,255,255))
++         self.doubleLabel = TextPanel(self, " "+`tokenList[4]`+" ", 10, wx.EXPAND)
++         self.doubleLabel.SetBackgroundColour(wx.Colour(255,84,166))
+       else:
+-         self.taxiLabel = TextPanel(self, " "+`tokenList[0]`+" ", 10, wxEXPAND)
+-         self.taxiLabel.SetBackgroundColour(wxColour(255, 191, 0))
+-         self.busLabel = TextPanel(self, " "+`tokenList[1]`+" ", 10, wxEXPAND)
+-         self.busLabel.SetBackgroundColour(wxColour(7, 155, 0))
+-         self.ugndLabel = TextPanel(self, " "+`tokenList[2]`+" ", 10, wxEXPAND)
+-         self.ugndLabel.SetBackgroundColour(wxColour(160, 36, 96))
+-         self.ugndLabel.SetForegroundColour(wxColour(255, 255, 255))
++         self.taxiLabel = TextPanel(self, " "+`tokenList[0]`+" ", 10, wx.EXPAND)
++         self.taxiLabel.SetBackgroundColour(wx.Colour(255, 191, 0))
++         self.busLabel = TextPanel(self, " "+`tokenList[1]`+" ", 10, wx.EXPAND)
++         self.busLabel.SetBackgroundColour(wx.Colour(7, 155, 0))
++         self.ugndLabel = TextPanel(self, " "+`tokenList[2]`+" ", 10, wx.EXPAND)
++         self.ugndLabel.SetBackgroundColour(wx.Colour(160, 36, 96))
++         self.ugndLabel.SetForegroundColour(wx.Colour(255, 255, 255))
+ 
+       # stack the inventory labels vertically
+-      self.invSizer = wxBoxSizer(wxVERTICAL)
++      self.invSizer = wx.BoxSizer(wx.VERTICAL)
+       if self.isMrX:
+-         self.invSizer.Add(self.blackLabel, 1, wxEXPAND|wxADJUST_MINSIZE)
+-         self.invSizer.Add(self.doubleLabel, 1, wxEXPAND|wxADJUST_MINSIZE)
++         self.invSizer.Add(self.blackLabel, 1, wx.EXPAND|wx.ADJUST_MINSIZE)
++         self.invSizer.Add(self.doubleLabel, 1, wx.EXPAND|wx.ADJUST_MINSIZE)
+       else:
+-         self.invSizer.Add(self.taxiLabel, 1, wxEXPAND|wxADJUST_MINSIZE)
+-         self.invSizer.Add(self.busLabel, 1, wxEXPAND|wxADJUST_MINSIZE)
+-         self.invSizer.Add(self.ugndLabel, 1, wxEXPAND|wxADJUST_MINSIZE)
++         self.invSizer.Add(self.taxiLabel, 1, wx.EXPAND|wx.ADJUST_MINSIZE)
++         self.invSizer.Add(self.busLabel, 1, wx.EXPAND|wx.ADJUST_MINSIZE)
++         self.invSizer.Add(self.ugndLabel, 1, wx.EXPAND|wx.ADJUST_MINSIZE)
+ 
+       # group the icon with the inventory
+-      iconInvSizer = wxBoxSizer(wxHORIZONTAL)
+-      iconInvSizer.Add(self.iconPanel, 0, wxALIGN_TOP|wxADJUST_MINSIZE)
+-      iconInvSizer.Add(self.invSizer, 0, wxALIGN_TOP|wxADJUST_MINSIZE)
++      iconInvSizer = wx.BoxSizer(wx.HORIZONTAL)
++      iconInvSizer.Add(self.iconPanel, 0, wx.ALIGN_TOP|wx.ADJUST_MINSIZE)
++      iconInvSizer.Add(self.invSizer, 0, wx.ALIGN_TOP|wx.ADJUST_MINSIZE)
+ 
+       # put the caption under the bitmap and inventory lists
+-      self.topSizer = wxBoxSizer(wxVERTICAL)
+-      self.topSizer.Add(iconInvSizer, 0, wxEXPAND|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 20)
+-      self.topSizer.Add(self.caption, 0, wxEXPAND|wxALIGN_CENTRE|wxALL, 2)
++      self.topSizer = wx.BoxSizer(wx.VERTICAL)
++      self.topSizer.Add(iconInvSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 20)
++      self.topSizer.Add(self.caption, 0, wx.EXPAND|wx.ALIGN_CENTRE|wx.ALL, 2)
+       self.SetSizer(self.topSizer)
+       self.topSizer.SetSizeHints(self)
+ 
+-      self.iconDC = wxMemoryDC()
+-      self.srcDC  = wxMemoryDC()
++      self.iconDC = wx.MemoryDC()
++      self.srcDC  = wx.MemoryDC()
+ 
+ 
+    def updateTokens(self, tokenList):
+@@ -131,14 +131,14 @@ class PlayerIcon(wxPanel):
+             self.srcDC, 0, 0)
+       self.srcDC.SelectObject(self.thinkingBitmap)
+       self.iconDC.Blit(0, 0, self.iconBitmap.GetWidth(), self.iconBitmap.GetHeight(),
+-            self.srcDC, 0, 0, wxCOPY, TRUE)
++            self.srcDC, 0, 0, wx.COPY, True)
+       self.iconDC.EndDrawing()
+-      self.iconDC.SelectObject(wxNullBitmap)
++      self.iconDC.SelectObject(wx.NullBitmap)
+       temp             = self.iconBitmap
+       self.iconBitmap  = self.iconBitmap2
+       self.iconBitmap2 = temp
+       self.icon.SetBitmap(self.iconBitmap)
+-      self.icon.Refresh(FALSE)
++      self.icon.Refresh(False)
+       self.isStuck = False
+ 
+ 
+@@ -150,14 +150,14 @@ class PlayerIcon(wxPanel):
+             self.srcDC, 0, 0)
+       self.srcDC.SelectObject(self.stuckBitmap)
+       self.iconDC.Blit(0, 0, self.iconBitmap.GetWidth(), self.iconBitmap.GetHeight(),
+-            self.srcDC, 0, 0, wxCOPY, TRUE)
++            self.srcDC, 0, 0, wx.COPY, True)
+       self.iconDC.EndDrawing()
+-      self.iconDC.SelectObject(wxNullBitmap)
++      self.iconDC.SelectObject(wx.NullBitmap)
+       temp             = self.iconBitmap
+       self.iconBitmap  = self.iconBitmap2
+       self.iconBitmap2 = temp
+       self.icon.SetBitmap(self.iconBitmap)
+-      self.icon.Refresh(FALSE)
++      self.icon.Refresh(False)
+       self.isStuck = True
+ 
+ 
+@@ -168,19 +168,19 @@ class PlayerIcon(wxPanel):
+       self.iconDC.Blit(0, 0, self.iconBitmap.GetWidth(), self.iconBitmap.GetHeight(),
+             self.srcDC, 0, 0)
+       self.iconDC.EndDrawing()
+-      self.iconDC.SelectObject(wxNullBitmap)
++      self.iconDC.SelectObject(wx.NullBitmap)
+       temp             = self.iconBitmap
+       self.iconBitmap  = self.iconBitmap2
+       self.iconBitmap2 = temp
+       self.icon.SetBitmap(self.iconBitmap)
+-      self.icon.Refresh(FALSE)
++      self.icon.Refresh(False)
+ 
+ 
+ 
+ # Manage a group of icons to represent all six players.
+-class PlayerIconGroup(wxPanel):
++class PlayerIconGroup(wx.Panel):
+    def __init__(self, parent, nameList, tokenList):
+-      wxPanel.__init__(self, parent, -1)
++      wx.Panel.__init__(self, parent, -1)
+ 
+       # Get icons for all the players
+       if len(nameList) != 6:
+@@ -200,9 +200,9 @@ class PlayerIconGroup(wxPanel):
+             nameList[i], tokenList[i]))
+ 
+ 
+-      self.topSizer = wxBoxSizer(wxHORIZONTAL)
++      self.topSizer = wx.BoxSizer(wx.HORIZONTAL)
+       for p in self.players:
+-         self.topSizer.Add(p, 0, wxALIGN_CENTRE) 
++         self.topSizer.Add(p, 0, wx.ALIGN_CENTRE) 
+       self.SetSizer(self.topSizer)
+       self.topSizer.SetSizeHints(self)
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/RegistrationWindow.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/RegistrationWindow.py
++++ londonlaw-0.2.1/londonlaw/guiclient/RegistrationWindow.py
+@@ -24,7 +24,7 @@
+ 
+ 
+ from twisted.python import log
+-from wxPython.wx import *
++import wx
+ from londonlaw.common.protocol import *
+ from londonlaw.common.config import *
+ from AutoListCtrl import *
+@@ -34,35 +34,35 @@ import os.path
+ 
+ 
+ # Create a small dialog for choosing a team.
+-class TeamDialog(wxDialog):
++class TeamDialog(wx.Dialog):
+    def __init__(self, parent):
+-      wxDialog.__init__(self, parent, -1, "Choose a Team", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxSUNKEN_BORDER)
+-      panel = wxPanel(self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
++      wx.Dialog.__init__(self, parent, -1, "Choose a Team", wx.DefaultPosition, wx.DefaultSize, wx.DEFAULT_DIALOG_STYLE|wx.SUNKEN_BORDER)
++      panel = wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
+ 
+-      self.choice = wxRadioBox(panel, -1, "team: ", wxDefaultPosition, wxDefaultSize,
+-         ["Detectives", "Mr. X"], 1, wxRA_SPECIFY_COLS)
+-      self.submitButton = wxButton(panel, wxID_OK, "OK")
+-      self.cancelButton = wxButton(panel, wxID_CANCEL, "Cancel")
+-
+-      buttonSizer = wxBoxSizer(wxHORIZONTAL)
+-      buttonSizer.Add(self.cancelButton, 0, wxALIGN_CENTRE|wxALL, 5)
+-      buttonSizer.Add(self.submitButton, 0, wxALIGN_CENTRE|wxALL, 5)
+-
+-      vSizer = wxBoxSizer(wxVERTICAL)
+-      vSizer.Add(self.choice, 0, wxALIGN_CENTRE|wxALL, 5)
+-      vSizer.Add((1, 1), 1, wxEXPAND)
+-      vSizer.Add(buttonSizer, 0, wxALIGN_RIGHT|wxALL, 5)
++      self.choice = wx.RadioBox(panel, -1, "team: ", wx.DefaultPosition, wx.DefaultSize,
++         ["Detectives", "Mr. X"], 1, wx.RA_SPECIFY_COLS)
++      self.submitButton = wx.Button(panel, wx.ID_OK, "OK")
++      self.cancelButton = wx.Button(panel, wx.ID_CANCEL, "Cancel")
++
++      buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
++      buttonSizer.Add(self.cancelButton, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
++      buttonSizer.Add(self.submitButton, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
++
++      vSizer = wx.BoxSizer(wx.VERTICAL)
++      vSizer.Add(self.choice, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
++      vSizer.Add((1, 1), 1, wx.EXPAND)
++      vSizer.Add(buttonSizer, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
+ 
+       panel.SetSizer(vSizer)
+       vSizer.Fit(panel)
+-      sizer = wxBoxSizer(wxVERTICAL)
+-      sizer.Add(panel, 1, wxEXPAND | wxALL, 5)
++      sizer = wx.BoxSizer(wx.VERTICAL)
++      sizer.Add(panel, 1, wx.EXPAND | wx.ALL, 5)
+       self.SetSizer(sizer)
+       sizer.Fit(self)
+       self.SetAutoLayout(1)
+ 
+-      EVT_BUTTON(self, wxID_OK, self.submit)
+-      EVT_BUTTON(self, wxID_CANCEL, self.cancel) 
++      wx.EVT_BUTTON(self, wx.ID_OK, self.submit)
++      wx.EVT_BUTTON(self, wx.ID_CANCEL, self.cancel) 
+ 
+ 
+    def submit(self, event):
+@@ -76,9 +76,9 @@ class TeamDialog(wxDialog):
+ 
+ 
+ # Generate the main registration window.
+-class RegistrationWindow(wxFrame):
++class RegistrationWindow(wx.Frame):
+    def __init__(self, parent, ID, title, messenger):
+-      wxFrame.__init__(self, parent, ID, title)
++      wx.Frame.__init__(self, parent, ID, title)
+ 
+       self._messenger = messenger
+ 
+@@ -86,17 +86,17 @@ class RegistrationWindow(wxFrame):
+       EXIT       = 101
+ 
+       # Create a menu bar
+-      fileMenu = wxMenu("File")
++      fileMenu = wx.Menu("File")
+       fileMenu.Append(DISCONNECT, "Disconnect", "Disconnect from server")
+       fileMenu.Append(EXIT, "Exit\tCTRL+Q", "Exit London Law")
+-      menuBar = wxMenuBar()
++      menuBar = wx.MenuBar()
+       menuBar.Append(fileMenu, "File")
+       self.SetMenuBar(menuBar)
+ 
+       self.status = self.CreateStatusBar()
+ 
+       # stick everything in a panel
+-      mainPanel = wxPanel(self, -1)
++      mainPanel = wx.Panel(self, -1)
+ 
+       self.list = AutoListCtrl(mainPanel, -1,
+             ("Player", "Team", "Votes to Start?", "Pawns"),
+@@ -104,31 +104,31 @@ class RegistrationWindow(wxFrame):
+ 
+       self.list.SetColumnWidth(1, 140) 
+ 
+-      mainSizer = wxBoxSizer(wxVERTICAL)
+-      mainSizer.Add(self.list, 3, wxALIGN_CENTRE|wxEXPAND|wxALL, 5)
++      mainSizer = wx.BoxSizer(wx.VERTICAL)
++      mainSizer.Add(self.list, 3, wx.ALIGN_CENTRE|wx.EXPAND|wx.ALL, 5)
+ 
+       self.chatWindow = ChatPanel(mainPanel, "", False)
+-      mainSizer.Add(self.chatWindow, 2, wxEXPAND|wxALL, 5)
++      mainSizer.Add(self.chatWindow, 2, wx.EXPAND|wx.ALL, 5)
+ 
+-      self.leaveButton = wxButton(mainPanel, -1, "Leave Game")
+-      self.teamButton  = wxButton(mainPanel, -1, "Choose Team")
+-      self.voteButton  = wxButton(mainPanel, -1, "Vote to Start")
+-      buttonSizer      = wxBoxSizer(wxHORIZONTAL)
+-      buttonSizer.Add(self.leaveButton, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT | wxBOTTOM | wxALL, 5)
+-      buttonSizer.Add((1, 1), 1, wxEXPAND)
+-      buttonSizer.Add(self.teamButton, 0, wxALIGN_CENTRE | wxRIGHT | wxBOTTOM | wxALL, 5)
+-      buttonSizer.Add(self.voteButton, 0, wxALIGN_CENTRE | wxRIGHT | wxBOTTOM | wxALL, 5)
+-      mainSizer.Add(buttonSizer, 0, wxEXPAND, 0)
++      self.leaveButton = wx.Button(mainPanel, -1, "Leave Game")
++      self.teamButton  = wx.Button(mainPanel, -1, "Choose Team")
++      self.voteButton  = wx.Button(mainPanel, -1, "Vote to Start")
++      buttonSizer      = wx.BoxSizer(wx.HORIZONTAL)
++      buttonSizer.Add(self.leaveButton, 0, wx.ALIGN_CENTRE | wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALL, 5)
++      buttonSizer.Add((1, 1), 1, wx.EXPAND)
++      buttonSizer.Add(self.teamButton, 0, wx.ALIGN_CENTRE | wx.RIGHT | wx.BOTTOM | wx.ALL, 5)
++      buttonSizer.Add(self.voteButton, 0, wx.ALIGN_CENTRE | wx.RIGHT | wx.BOTTOM | wx.ALL, 5)
++      mainSizer.Add(buttonSizer, 0, wx.EXPAND, 0)
+ 
+       mainPanel.SetSizer(mainSizer)
+       mainSizer.Fit(mainPanel)
+ 
+-      EVT_MENU(self, EXIT, self.menuExit)
+-      EVT_MENU(self, DISCONNECT, self.menuDisconnect)
+-      EVT_BUTTON(self, self.leaveButton.GetId(), self.leaveGame)
+-      EVT_BUTTON(self, self.teamButton.GetId(), self.chooseTeam)
+-      EVT_BUTTON(self, self.voteButton.GetId(), self.voteStart)
+-      EVT_TEXT_ENTER(self, self.chatWindow.chatEntry.GetId(), self.chatSend)
++      wx.EVT_MENU(self, EXIT, self.menuExit)
++      wx.EVT_MENU(self, DISCONNECT, self.menuDisconnect)
++      wx.EVT_BUTTON(self, self.leaveButton.GetId(), self.leaveGame)
++      wx.EVT_BUTTON(self, self.teamButton.GetId(), self.chooseTeam)
++      wx.EVT_BUTTON(self, self.voteButton.GetId(), self.voteStart)
++      wx.EVT_TEXT_ENTER(self, self.chatWindow.chatEntry.GetId(), self.chatSend)
+ 
+ 
+    def addPlayer(self, data):
+@@ -154,7 +154,7 @@ class RegistrationWindow(wxFrame):
+ 
+ 
+    def enableSelectButton(self, event):
+-      self.selectButton.Enable(TRUE)
++      self.selectButton.Enable(True)
+ 
+ 
+    def disableSelectButton(self, event):
+@@ -180,8 +180,8 @@ class RegistrationWindow(wxFrame):
+ 
+    def showInfoAlert(self, info):
+       self.PushStatusText("")
+-      alert = wxMessageDialog(self, info,
+-         "Server Message", wxOK|wxICON_INFORMATION)
++      alert = wx.MessageDialog(self, info,
++         "Server Message", wx.OK|wx.ICON_INFORMATION)
+       alert.ShowModal()
+ 
+ 
+@@ -190,17 +190,17 @@ class RegistrationWindow(wxFrame):
+ 
+ 
+    def menuExit(self, event):
+-      alert = wxMessageDialog(self, "Disconnect from the server and exit London Law?",
+-         "Disconnect and Quit", wxYES_NO|wxICON_EXCLAMATION)
+-      if alert.ShowModal() == wxID_YES:
++      alert = wx.MessageDialog(self, "Disconnect from the server and exit London Law?",
++         "Disconnect and Quit", wx.YES_NO|wx.ICON_EXCLAMATION)
++      if alert.ShowModal() == wx.ID_YES:
+          self._messenger.netDisconnect()
+          self.Close()
+ 
+ 
+    def menuDisconnect(self, event):
+-      alert = wxMessageDialog(self, "Disconnect from the server?",
+-         "Disconnect", wxYES_NO|wxICON_EXCLAMATION)
+-      if alert.ShowModal() == wxID_YES:
++      alert = wx.MessageDialog(self, "Disconnect from the server?",
++         "Disconnect", wx.YES_NO|wx.ICON_EXCLAMATION)
++      if alert.ShowModal() == wx.ID_YES:
+          self._messenger.netDisconnect()
+          self._messenger.guiLaunchConnectionWindow()
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/ScrolledLabel.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/ScrolledLabel.py
++++ londonlaw-0.2.1/londonlaw/guiclient/ScrolledLabel.py
+@@ -19,26 +19,26 @@
+ 
+ # ScrolledLabel.py
+ #
+-# This class handles a wxStaticText that is managed by a scrolled window.
++# This class handles a wx.StaticText that is managed by a scrolled window.
+ 
+ 
+-from wxPython.wx import *
++import wx
+ 
+-class ScrolledLabel(wxScrolledWindow):
++class ScrolledLabel(wx.ScrolledWindow):
+    def __init__(self, parent, label):
+-      wxScrolledWindow.__init__(self, parent, -1, wxDefaultPosition, wxDefaultSize, 
+-         wxVSCROLL | wxSIMPLE_BORDER)
+-      self.SetBackgroundColour(wxColour(200, 200, 200))
++      wx.ScrolledWindow.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize, 
++         wx.VSCROLL | wx.SIMPLE_BORDER)
++      self.SetBackgroundColour(wx.Colour(200, 200, 200))
+       self.SetScrollRate(0, 5)
+ 
+       # create the text that will be scrolled
+-      self.text = wxStaticText(self, -1, label, wxPoint(0,0))
++      self.text = wx.StaticText(self, -1, label, wx.Point(0,0))
+ 
+       # use a Sizer to handle geometry
+-      self.topSizer = wxBoxSizer(wxVERTICAL)
+-      self.topSizer.Add(self.text, 1, wxEXPAND)
++      self.topSizer = wx.BoxSizer(wx.VERTICAL)
++      self.topSizer.Add(self.text, 1, wx.EXPAND)
+       self.SetSizer(self.topSizer)
+-      self.topSizer.SetVirtualSizeHints(self)
++      self.topSizer.FitInside(self)
+ 
+       self.ScrollToEnd()
+ 
+@@ -62,7 +62,7 @@ class ScrolledLabel(wxScrolledWindow):
+ 
+    # scroll to the bottom of the text
+    def ScrollToEnd(self):
+-      self.topSizer.SetVirtualSizeHints(self)
++      self.topSizer.FitInside(self)
+       self.Scroll(0, self.GetVirtualSize()[1]/5)
+ 
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/TextPanel.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/TextPanel.py
++++ londonlaw-0.2.1/londonlaw/guiclient/TextPanel.py
+@@ -19,25 +19,25 @@
+ 
+ # TextPanel.py
+ #
+-# This class handles a wxStaticText drawn on a wxPanel.  The combination
++# This class handles a wx.StaticText drawn on a wx.Panel.  The combination
+ # allows one to set both foreground and background colors, as well as
+ # borders around the window.
+ 
+-from wxPython.wx import *
++import wx
+ 
+-# Generate a text label drawn on a wxPanel.
+-class TextPanel(wxPanel):
++# Generate a text label drawn on a wx.Panel.
++class TextPanel(wx.Panel):
+    def __init__(self, parent, text, points = 10, style = 0):
+-      wxPanel.__init__(self, parent, -1, wxDefaultPosition, wxDefaultSize, style)
++      wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize, style)
+ 
+-      font = wxFont(points, wxDEFAULT, wxNORMAL, wxNORMAL)
+-      self.text = wxStaticText(self, -1, text, wxPoint(0,0))
++      font = wx.Font(points, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
++      self.text = wx.StaticText(self, -1, text, wx.Point(0,0))
+       self.text.SetFont(font)
+ 
+-      self.sizer = wxBoxSizer(wxVERTICAL)
+-      self.sizer.Add((0, 0), 1, wxEXPAND)
+-      self.sizer.Add(self.text, 0, wxALIGN_CENTRE|wxADJUST_MINSIZE)
+-      self.sizer.Add((0, 0), 1, wxEXPAND)
++      self.sizer = wx.BoxSizer(wx.VERTICAL)
++      self.sizer.Add((0, 0), 1, wx.EXPAND)
++      self.sizer.Add(self.text, 0, wx.ALIGN_CENTRE|wx.ADJUST_MINSIZE)
++      self.sizer.Add((0, 0), 1, wx.EXPAND)
+       self.SetSizer(self.sizer)
+       self.sizer.SetSizeHints(self)
+ 
+@@ -48,13 +48,13 @@ class TextPanel(wxPanel):
+ 
+    def SetForegroundColour(self, color):
+       self.text.SetForegroundColour(color)
+-      wxPanel.SetForegroundColour(self, color)
++      wx.Panel.SetForegroundColour(self, color)
+ 
+    # def SetBackgroundColour(self, color)
+-   # (this function falls through to call SetBackgroundColour on the wxPanel)
++   # (this function falls through to call SetBackgroundColour on the wx.Panel)
+    def SetBackgroundColour(self, color):
+       self.text.SetBackgroundColour(color)
+-      wxPanel.SetBackgroundColour(self, color)
++      wx.Panel.SetBackgroundColour(self, color)
+    
+ 
+ 
+Index: londonlaw-0.2.1/londonlaw/guiclient/graphicalmap.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/graphicalmap.py
++++ londonlaw-0.2.1/londonlaw/guiclient/graphicalmap.py
+@@ -16,7 +16,7 @@
+ 
+ 
+ 
+-from wxPython.wx import *
++import wx
+ from utility import *
+ from SetHash import *
+ from londonlaw.common.config import *
+@@ -241,9 +241,9 @@ def locToPixel(loc, zoom):
+ GRIDSIZE = (100, 100)
+ MASKSIZE = (39, 42)  # size of a rect that contains a map number graphic
+ gridHash = SetHash()
+-wxInitAllImageHandlers()
++# no-op in wxPython2.8 and later: wx.InitAllImageHandlers()
+ maskImageFile = os.path.join(MEDIAROOT, "images/map-number-mask.png")
+-maskImage = wxImage(maskImageFile, wxBITMAP_TYPE_ANY)
++maskImage = wx.Image(maskImageFile, wx.BITMAP_TYPE_ANY)
+ 
+ 
+ # Create a hash table that assists in mapping pixel locations to map numbers.
+Index: londonlaw-0.2.1/londonlaw/guiclient/Protocol.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/Protocol.py
++++ londonlaw-0.2.1/londonlaw/guiclient/Protocol.py
+@@ -21,7 +21,7 @@ from twisted.python import log
+ import shlex, sys
+ from londonlaw.common import util
+ from londonlaw.common.protocol import *
+-from wxPython.wx import *
++import wx
+ 
+ 
+ class ProtocolError(Exception):
+Index: londonlaw-0.2.1/londonlaw/guiclient/StaticBitmap.py
+===================================================================
+--- londonlaw-0.2.1.orig/londonlaw/guiclient/StaticBitmap.py
++++ londonlaw-0.2.1/londonlaw/guiclient/StaticBitmap.py
+@@ -20,27 +20,27 @@
+ # StaticBitmap.py
+ #
+ # This class is an attempt at a more robust cross-platform version of a
+-# wxStaticBitmap.
++# wx.StaticBitmap.
+ 
+-from wxPython.wx import *
++import wx
+ 
+-class StaticBitmap(wxWindow):
+-   def __init__(self, parent, id, bitmap, position = wxDefaultPosition, size = wxDefaultSize):
+-      wxWindow.__init__(self, parent, id, position, size)
++class StaticBitmap(wx.Window):
++   def __init__(self, parent, id, bitmap, position = wx.DefaultPosition, size = wx.DefaultSize):
++      wx.Window.__init__(self, parent, id, position, size)
+       self.bitmap = bitmap
+-      self.SetSize(wxSize(self.bitmap.GetWidth(), self.bitmap.GetHeight()))
++      self.SetSize(wx.Size(self.bitmap.GetWidth(), self.bitmap.GetHeight()))
+ 
+-      EVT_PAINT(self, self.OnPaint)
++      wx.EVT_PAINT(self, self.OnPaint)
+ 
+ 
+    def OnPaint(self, event):
+-      self.srcDC  = wxMemoryDC()
++      self.srcDC  = wx.MemoryDC()
+       self.srcDC.SelectObject(self.bitmap)
+-      destDC = wxPaintDC(self)
++      destDC = wx.PaintDC(self)
+       destDC.BeginDrawing()
+       destDC.Blit(0, 0, self.bitmap.GetWidth(), self.bitmap.GetHeight(), self.srcDC, 0, 0)
+       destDC.EndDrawing()
+-      self.srcDC.SelectObject(wxNullBitmap)
++      self.srcDC.SelectObject(wx.NullBitmap)
+ 
+ 
+    def GetBitmap(self):
+@@ -53,11 +53,11 @@ class StaticBitmap(wxWindow):
+ 
+    def DoGetBestSize(self):
+       print "called DoGetBestSize()"
+-      return wxSize(self.bitmap.GetWidth(), self.bitmap.GetHeight())
++      return wx.Size(self.bitmap.GetWidth(), self.bitmap.GetHeight())
+    
+ #   def GetBestSize(self):
+ #      print "called GetBestSize()"
+-#      return wxSize(self.bitmap.GetWidth(), self.bitmap.GetHeight())
++#      return wx.Size(self.bitmap.GetWidth(), self.bitmap.GetHeight())
+ 
+ 
+ # arch-tag: DO_NOT_CHANGE_a21ebe5e-e749-45fb-81fb-fa430d46cf0e 


More information about the scm-commits mailing list