2014-12-26 539 views
1

因此,我正在为一个学校项目制作这个hang子手游戏,并且遇到了一个问题,我不能为我的生活弄清楚甚至为什么它发生。Python - Tkinter:错误,说我的索引超出范围,当有

word_list = ["APPLE", "PEAR", "BANNANA"] 

word = word_list [random.randint(0,2)] 

hidden_word = ["_ " * len(word)] 
print (word) 

这段代码是一个列表,然后制作成一个字符串变量的一个词:

word = word_list [random.randint(0,2)] 

我再做出新的列表是隐藏的字,用“_”用来隐藏,通过获取长度:

hidden_word = ["_ " * len(word)] 

我再打印字(发展)

print (word) 

对有问题的代码。

def click_1 (key): 
    if str(key) in word: 
     key_1 = word.index(key) 
     print (key_1) 
     hidden_word[key_1] = key 
     print (hidden_word) 
    else: 
     print ("Nope") 
    return letter 

r = c = 0 
for letter in string.ascii_uppercase: 
    Button(letter_frame, text=letter, command=functools.partial(click_1, letter)).grid(row=r, column=c, sticky=W) 
    c += 1 
    if c > 12: 
     c = 0 
     r += 1 

这使得butons上来,当我点击与字母的按钮,它会检查它是否在词,然后(目前)打印:

BANNANA 
>>> 0 
['B'] 

如果词是bannana。问题是,当我按A:

1 

来了,如果我按别的东西,出现此错误:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/idlelib/run.py", line 121, in main 
    seq, request = rpc.request_queue.get(block=True, timeout=0.05) 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/queue.py", line 175, in get 
    raise Empty 
queue.Empty 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 1475, in __call__ 
    return self.func(*args) 
    File "/Users/alexeacott/Desktop/Hangman.py", line 24, in click_1 
    hidden_word[key_1] = key 
IndexError: list assignment index out of range 

最后一行是最intersest的,因为apparantly,N是超出范围。我的问题是,为什么会发生这种情况,我该如何解决。

节日快乐!

回答

3

下面的行制作列表与单个元素(elemnt与字长长“_ _ _ ...”字符串的字符串):

hidden_word = ["_ " * len(word)] 

访问元素(索引> 0 )导致IndexError,因为列表中只有一个元素。

您可能希望创建多个元素的列表:

hidden_word = ["_ "] * len(word) 

>>> ["_ " * 3] 
['_ _ _ '] 
>>> ["_ "] * 3 
['_ ', '_ ', '_ '] 
+0

所以我需要做的是改变的方括号?耶稣我很笨,哈哈,谢谢!我有一个额外的问题:现在我有这个工作,当我点击按钮的输出是正确的,但如果有多个实例的字母,它不会取代那个,因此,如果一个字母重复我永远不能完成一个字!我不知道从哪里开始:/ – 18166

+0

@ 18166,'list.index'返回第一个匹配项的索引。而不是使用它,迭代列表项目,检查项目是否匹配输入字符,并对匹配执行适当的操作。 – falsetru