Я только что переупаковал свою программу. Ранее все модули жили в пакете "Whyteboard", с пакетом "Fakewidgets", содержащим кучу фиктивных объектов тестирования GUI.
Теперь все мои модули находятся в пакетах, например whyteboard.gui, whyteboard.misc, whyteboard.test - вот где сейчас живут fakewidgets.
Теперь, когда я запускаю мои тесты, я получаю исключение,
File "/home/steve/Documents/whyteboard/whyteboard/gui/canvas.py", line 77, in __init__
wx.ScrolledWindow.__init__(self, tab, style=wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_CHILDREN)
TypeError: unbound method __init__() must be called with ScrolledWindow instance as first argument (got Canvas instance instead)
здесь
рассматриваемый класс
class Canvas(wx.ScrolledWindow):
def __init__(self, tab, gui, area):
wx.ScrolledWindow.__init__(self, tab, style=wx.NO_FULL_REPAINT_ON_RESIZE | wx.CLIP_CHILDREN)
Однако моя программа загружается и работает правильно, за исключением тестов модулей. Код такой же, только код для импорта моих тестов отличается от новых пакетов.
До:
import os
import wx
import fakewidgets
import gui
import lib.mock as mock
from canvas import Canvas, RIGHT, DIAGONAL, BOTTOM
from fakewidgets.core import Bitmap, Event, Colour
from lib.configobj import ConfigObj
from lib.pubsub import pub
from lib.validate import Validator
сейчас:
import os
import wx
import whyteboard.test
import whyteboard.gui.frame as gui
from whyteboard.lib import ConfigObj, mock, pub, Validator
from whyteboard.gui.canvas import Canvas, RIGHT, DIAGONAL, BOTTOM
from whyteboard.test.fakewidgets.core import Bitmap, Event, Colour, PySimpleApp
Возможно, стоит отметить, что пакет fakewidgets заставляет мою программу думать, что она использует классы wxPython, хотя они и являются ложными.
Это из модуля, который импортирован whyteboard.test.fakewidgets '__init__
class Window(object):
def __init__(self, parent, *args, **kwds):
self.parent = parent
self.Enabled = True
self.calls = []
self.size = (0, 0)
self.captured = False
def GetClientSizeTuple(self):
return (0, 0)
self.captured = True
def GetId(self):
pass
def Fit(self):
pass
def SetFocus(self):
pass
def PrepareDC(self, dc):
pass
def Destroy(self):
pass
...
class ScrolledWindow(Window):
def SetVirtualSize(self, *size):
pass
def SetVirtualSizeHints(self, *size):
pass
import wx
wx.__dict__.update(locals())