2015-04-29 3 views
0

Моя функция не дает мне правильный выход, и он не хочет работать. Я получаю эту ошибку:Функция Python не работает - Tkinter

TypeError: list indices must be integers, not str 

Это мой код:

def showShop(level = level, cash = cash): 
     top = Tkinter.Tk() 
     shop = ["$100 & level 2 - Shotgun", "$250 & level 3 - 5 Grenades", "$500 & level 5 - Rocket Launcher"] 
     buttons = [] 
     for i in shop: 
     temp = shop[i] 
     temp = Tkinter.Button(top, height=10, width=100, text = temp, command = shopping(i)) 
     temp.pack() 
     buttons.append(temp) 
     top.mainloop() 

Я хочу, чтобы показать то, что находится в списке магазинов на основе того, что кнопка это ...

+0

не может быть, что умный .... – SilverNeon123

+0

Пожалуйста [принимать] (http://meta.stackexchange.com/questions/5234) ответ, если вы думаете, это решит вашу проблему. Это будет сообщество в целом, чтобы признать правильное решение. Это можно сделать, нажав зеленую галочку рядом с ответом. См. Это [изображение] (http://i.stack.imgur.com/uqJeW.png) для справки. Приветствия. –

ответ

6

Удалить temp = shop[i] из кода

for i in shop: 
     temp = Tkinter.Button(top, height=10, width=100, text = temp, command = shopping(i)) 
     temp.pack() 
     buttons.append(temp) 

в for итерации цикла по Элементы в списке, а не индексы !. Питон docs сделать его более ясным

The for statement in Python differs a bit from what you may be used to in C or Pascal. Rather than always iterating over an arithmetic progression of numbers (like in Pascal), or giving the user the ability to define both the iteration step and halting condition (as C), Python’s for statement iterates over the items of any sequence (a list or a string), in the order that they appear in the sequence.

отметить также, что command аргумент в конструкторе Button принимает функцию в качестве аргумента. Так что вам, может быть, лучше, написав command = shopping вместо звонка command = shopping(i).

+0

Может также быть полезно указать на неизбежные проблемы, вызванные 'command = shopping (i)' – Jkdc

+0

@Jkdc. Мы не знаем, что делает функция 'shopping'! Но лучше добавить строку! Спасибо :) –

0

Изменить for i in shopfor i in xrange(shop).

+0

Когда я запускаю, думаю, что он говорит, что 'i' в' settings (i) 'всегда равен четырем .... – SilverNeon123

0

Вы должны использовать что-то вроде частичного для передачи аргументов функции, вызываемой нажатием кнопки. Обратите внимание, что вы указали переменную temp как две разные вещи. Единственная причина, по которой он работает, заключается в том, что вторая декларация после первого использования. Также обратите внимание, что список «buttons» не может использоваться вне функции showShop(), потому что он создан в/local для этой функции. Ниже приведен рабочий код, основанный на том, что вы опубликовали. Кроме того, не используйте «i», «l» или «O» как однозначные имена переменных, поскольку они могут выглядеть как цифры.

import Tkinter 
from functools import partial 

def shopping(btn_num): 
    print "button number %d pressed" % (btn_num) 
    buttons[btn_num]["bg"]="lightblue" 

def showShop(buttons): 
     top = Tkinter.Tk() 
     shop = ["$100 & level 2 - Shotgun", "$250 & level 3 - 5 Grenades", 
       "$500 & level 5 - Rocket Launcher"] 

     ##buttons = [] 
     for ctr in range(len(shop)): 
     temp = Tkinter.Button(top, height=10, width=100, text = shop[ctr], 
       command = partial(shopping, ctr)) 
     temp.pack() 
     buttons.append(temp) 
     top.mainloop() 

## lists are mutable 
buttons=[] ## not local to the function 
showShop(buttons) 
Смежные вопросы