Control: tags 759084 + patch Control: severity -1 serious # Justification: blocks the on-going wxpython3.0 transition
I've rebuilt londonlaw with the attached patch and play-tested it, and it seems to work well. I'm happy to NMU this change - just let me know if you'd like me to. Cheers, Olly
diff -Nru londonlaw-0.2.1/debian/changelog londonlaw-0.2.1/debian/changelog --- londonlaw-0.2.1/debian/changelog 2013-10-21 04:45:58.000000000 +1300 +++ londonlaw-0.2.1/debian/changelog 2014-09-20 00:07:42.000000000 +1200 @@ -1,3 +1,12 @@ +londonlaw (0.2.1-17.1) unstable; urgency=medium + + * Non-maintainer upload. + * Update to work with wxPython 3.0 (Closes: #759084): + + New patch wxpy3.0-compat.patch, incorporating updated version of + 01_wx24_fix.patch. + + -- Olly Betts <o...@survex.com> Fri, 19 Sep 2014 12:07:04 +0000 + londonlaw (0.2.1-17) unstable; urgency=low * Team upload. diff -Nru londonlaw-0.2.1/debian/patches/01_wx24_fix.patch londonlaw-0.2.1/debian/patches/01_wx24_fix.patch --- londonlaw-0.2.1/debian/patches/01_wx24_fix.patch 2013-10-21 04:26:50.000000000 +1300 +++ londonlaw-0.2.1/debian/patches/01_wx24_fix.patch 1970-01-01 12:00:00.000000000 +1200 @@ -1,17 +0,0 @@ -Index: londonlaw/londonlaw/guiclient/__init__.py -=================================================================== ---- londonlaw.orig/londonlaw/guiclient/__init__.py 2013-10-20 17:26:38.995205000 +0200 -+++ londonlaw/londonlaw/guiclient/__init__.py 2013-10-20 17:26:47.151205000 +0200 -@@ -23,6 +23,12 @@ - - from twisted.internet import protocol, reactor - from twisted.python import log -+import wxversion -+try: -+ wxversion.select("2.8") -+except wxversion.VersionError: -+ wxversion.select("2.4") -+ - from wxPython.wx import * - from ConnectWindow import * - from GameListWindow import * diff -Nru londonlaw-0.2.1/debian/patches/series londonlaw-0.2.1/debian/patches/series --- londonlaw-0.2.1/debian/patches/series 2013-10-20 20:48:21.000000000 +1300 +++ londonlaw-0.2.1/debian/patches/series 2014-08-15 23:31:12.000000000 +1200 @@ -1,2 +1,2 @@ -01_wx24_fix.patch python-zope-fixes.patch +wxpy3.0-compat.patch diff -Nru londonlaw-0.2.1/debian/patches/wxpy3.0-compat.patch londonlaw-0.2.1/debian/patches/wxpy3.0-compat.patch --- londonlaw-0.2.1/debian/patches/wxpy3.0-compat.patch 1970-01-01 12:00:00.000000000 +1200 +++ londonlaw-0.2.1/debian/patches/wxpy3.0-compat.patch 2014-09-20 00:05:10.000000000 +1200 @@ -0,0 +1,2296 @@ +Description: Update for wxPython3.0 compatibility. +Author: Olly Betts <o...@survex.com> +Forwarded: no +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