2013-04-28 2 views
0

У меня возникли проблемы после ошибки, которые я получаю, который:Index Error: индекс списка из диапазона (Python) - печать на консоль

Traceback (most recent call last): 
    File "/Users/joelwilliams/Desktop/delete me", line 30, in <module> 
    v.writef('======================', 10, 10) 
    File "/Users/joelwilliams/Desktop/delete me", line 24, in writef 
    self.write(word) 
    File "/Users/joelwilliams/Desktop/delete me", line 15, in write 
    self.l[ self.y ] [ self.x : (self.x + len(word)) ] = word 
IndexError: list index out of range 

Основной код здесь:

class board(): 
    def __init__(self): 
     self.x, self.y = 0, 0 
     self.l = [] 
     self.screenWidth, self.screenHeight = 0, 0 

    def createBoard(self): 
     listBig = [ ['`'] * self.screenWidth for _ in range(self.screenHeight) ] 

    def setup(self, sw, sh): 
     self.screenWidth = sw - 1 
     self.screenHeight = sh - 1 

    def write(self, word): 
     self.l[ self.y ] [ self.x : (self.x + len(word)) ] = word 

    def draw(self): 
     for v in self.l: 
      print(''.join(v)) 

    def writef(self, word, y, x): 
     self.cursorPosX = x - 1 
     self.cursorPosY = y - 1 
     self.write(word) 

v = board() 
v.setup(75, 20) 
v.createBoard() 

v.writef('======================', 10, 10) 
v.writef('=     =', 11, 10) 
v.writef('= Pls Work.  =', 12, 10) 
v.writef('=     =', 13, 10) 
v.writef('======================', 14, 10) 

v.draw() 

желаемый результат для консоли на дисплее:

  ====================== 
      =     = 
      = Pls Work.  = 
      =     = 
      ====================== 

я использовал this в качестве руководства по с вспомните вышеуказанный код заранее!

+0

Я клянусь, что это последний вопрос сегодня :) –

ответ

1

В вашем методе createBoard():

def createBoard(self): 
    listBig = [ ['`'] * self.screenWidth for _ in range(self.screenHeight) ] 

Вы создаете список нужной длины и высоты, но вы никогда не назначить его self.l. Так self.l еще список длины 0.

Кроме того, в методе write():

def write(self, word): 
    self.l[ self.y ] [ self.x : (self.x + len(word)) ] = word 

Похоже, что вы хотели self.cursorPosX (и Y) там вместо self.x и self.y.

Сделайте эти два изменения, и ваша программа должна делать то, что вы пытаетесь сделать.

+0

я установил 2 ошибки и как волшебство, это работает! Благодаря! –

1

Ваш код

  • создает доску (теперь self.l == [])
  • устанавливает платы в течение двух вызовов функций, одна из которых устанавливает функцию локальной переменной bigList; возможно, вы хотели установить self.l (но все же self.l == [])
  • устанавливает две переменные экземпляра cursorPosX и cursorPosY, на которые не ссылаются нигде; Я предполагаю, вы имели в виду установить x и y (и до сих пор self.l == [])
  • пытается извлечь элемент элемента self.l (при self.l == [])

Это поможет, если вы на самом деле инициализируется self.l где-то. Предлагаю перекатывать .__init__(), .setup() и .createBoard() в один, и аналогично .write() и .writef(). Нечто подобное ::

class Board(): 
    def __init__(self, width, height): 
    self.l = [['`'] * (width - 1) for _ in range(height - 1)] 

    def write(self, text, x, y): 
    dx = x + len(text) 
    self.l[y][x:dx] = text 

    def draw(self): 
    for row in self.l: 
     print(''.join(row)) 

Обратите внимание, что бесполезные переменные члены screenWidth, screenHeight, x, y, cursorPosX и cursorPosY все были устранены.

Чтобы использовать этот новый код:

board = Board(75, 20) 
board.write('======================', 10, 10) 
board.write('=     =', 11, 10) 
board.write('= Pls Work.  =', 12, 10) 
board.write('=     =', 13, 10) 
board.write('======================', 14, 10) 
board.draw() 
+0

Я не заметил всех этих ошибок. Спасибо за помощь и лучший способ сделать мою программу! –