2014-01-07 3 views
0
def menurender(): 
global pos 
global menulist 
line1=menulist[pos] 
if pos == len(menulist): 
    line2="back" 
else: 
    line2=menulist[pos+1] 

lcd.clear() 
lcd.message(str(pos)+' ' +line1+ "\n"+str(pos+1)+' '+ line2) 

В моем блоке коды, у меня есть условные функции menurender(), который проверяет, чтобы убедиться, что список menulist имеет допустимый индекс до ссылки, но я получаю IndexError: индекс списка вне диапазона. Я понимаю, что оператор else вызывает его, но я запутался, потому что python не должен его выполнять.IndexError в неиспользованном условном

Полный код

#!/usr/bin/python 

################################################# 
#IMPORTS######################################### 
################################################# 
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate 
from Adafruit_I2C import Adafruit_I2C 

################################################# 
#OBJECTS######################################### 
################################################# 
lcd = Adafruit_CharLCDPlate() 


################################################# 
#VARIABLES####################################### 
################################################# 
#current button value 
prevbutton = "NULL" 
#for SELECT key and determining clicks 
action = False 
#variable for menu position 
pos = 0 
#on screen cursor 0 for top line, 1 for bottom line 
cursor = 0 

#Handles list structure and action when clicked 
menulist= [] 
menulist.append("CPU") 
menulist.append("RAM") 
menulist.append("STORAGE") 
menulist.append("NETWORK") 


#get input from keys and return the currently pressed key 
def buttonstatus(): 
    bstatus = "Null" 
    if lcd.buttonPressed(lcd.SELECT) == True: 
     bstatus="SELECT" 
    elif lcd.buttonPressed(lcd.UP) == True: 
     bstatus="UP" 
    elif lcd.buttonPressed(lcd.DOWN) == True: 
     bstatus="DOWN" 
    elif lcd.buttonPressed(lcd.LEFT) == True: 
     bstatus="LEFT" 
    elif lcd.buttonPressed(lcd.RIGHT) == True: 
     bstatus="RIGHT" 
    return bstatus 

#checks buttons pressed and converts that into action for top menu 

def getinput(): 
    global prevbutton 
    global pos 
    if buttonstatus() != prevbutton: 
     prevbutton = buttonstatus() 
     if buttonstatus() == "SELECT": 
      print "select" 
     elif buttonstatus() == "DOWN": 
      pos = pos + 1 
     elif buttonstatus() == "UP": 
      pos = pos -1 
     #elif buttonstatus() == "LEFT": 
      #print "left" 
     #elif buttonstatus() == "RIGHT": 
      #print "right" 

#defines bounds for the position of the cursor 
def posbounds(): 
    global pos 
    global menulist 
    if pos < 0: 
     pos = 0 
    if pos == len(menulist): 
     pos = len(menulist) 


#code renders the menu on the LCD 
def menurender(): 
    global pos 
    global menulist 
    line1=menulist[pos] 
    if pos == len(menulist): 
     line2="back" 
    else: 
     line2=menulist[pos+1] 

    lcd.clear() 
    lcd.message(str(pos)+' ' +line1+ "\n"+str(pos+1)+' '+ line2) 


while True: 
    getinput() 
    posbounds() 
    menurender() 
+0

Списки с 0-индексацией, они идут от 0 до len() - 1. – uselpa

+0

Индексы начинаются с 0. Вы ищете 'if pos == len (menulist) -1'? – freakish

ответ

2

Есть много, если значения pos != len(menulist), для которых menulist[pos+1]IndexError дает оценку (в том числе pos == len(menulist) - 1). Вы должны проверить

if pos > (len(menulist) - 2): 
+0

Спасибо, что исправил мою проблему с выходом за пределы – afiolmahon

0

Вы, вероятно, следует изменить if pos == len(menulist): к if pos == len(menulist) - 1: если вы хотите проверить, если позиция является индекс последнего элемента, или if pos == len(menulist) - 2:, если вы хотите, чтобы проверить на предпоследний элемент.

Лучшим способом сделать это может быть использование блока try ... except.

try: 
    line2 = menulist[pos+1] 
except IndexError: 
    # Out of range -> pos is greater than len(menulist)-1 
    line2 = 'back' 

Однако - это не кажется, Лика в Pythonic способ делать что-либо вообще в Python. Может быть, вы могли бы рассказать нам, чего вы пытаетесь достичь, и кто-то здесь может предложить лучший способ сделать это.

+0

Спасибо, Это исправило мою проблему! – afiolmahon

+0

@afiolmahon Тогда вам стоит подумать о его продолжении .. :) hehe –

Смежные вопросы