2016-08-01 2 views
-2

Я хочу написать цикл for, который выполняет итерацию по списку. В списке находится колода «карт». Есть 16 карт с нумерацией 0 - 7. Каждый номер отображается в списке дважды.Почему это для цикла не работает

Когда я прокомментирую цикл for, программа правильно отображает 1 карту в левой части холста. Но когда я использую цикл, ничего не отображается. Код является неполным, его нужно запускать с использованием определенного онлайн-программного обеспечения. Ссылка на всю программу приведена ниже.

http://www.codeskulptor.org/#user41_ZFQIR6Hm1W_0.py

Я хочу использовать цикл для заполнения полотна с 14 чисел в диапазоне 0-7.

Вот код, сообщите мне, если вы можете обнаружить ошибку.

#card width: 
C_W = 50 
#card height: 
C_H = 98 
#upper left corner of a card: 
u_l = [1 , 1] 
deck = range(0,8) 
deck1 = deck 
deck.extend(deck1) 

#called by a button on the GUI 
def new_game(): 
    random.shuffle(deck) 

# cards are 50x100 pixels in size  
def draw(canvas): 
    global C_W, C_H, deck 
    count = 0 
    for card in deck: 
     canvas.draw_text(str(deck[count]), (C_W/3, C_H - 25), 60, "White") 
     C_W += C_W 
     count += 1 
+1

Где вы называете 'draw' и' new_game'? – Holloway

+0

@ Холлоуэй код не заполнен, но если вы будете следовать приведенной мной ссылке, вы сможете попробовать. Кнопка на графическом интерфейсе вызывает функцию new_game() – Ekaterina1234

+3

Ok. [Не могли бы вы отредактировать вопрос, чтобы это отразить?] (Http://stackoverflow.com/help/mcve) – Holloway

ответ

1

draw() функция simplegui вызывается примерно 60 на второй и кода в цикле for внутри вашей версии удваивает глобальные C_W 16 раз каждый раз, когда функция называется. Это означает, что его значение быстро становится астрономическим, и текст тянется от экрана справа где-то за пределами нашей галактики.

Вот простой способ избежать этой проблемы:

def draw(canvas): 
    global C_W, C_H, deck 
    count = 0 
    c_w = C_W # init with value of global variable 
    for card in deck: # note "card" is not being used 
     canvas.draw_text(str(deck[count]), (c_w/3, C_H - 25), 60, "White") 
     c_w += c_w 
     count += 1 
+0

Даже когда я меняю C_W + = C_W на C_W + = 50, цифры печатаются на холсте для фракции секунды, а затем исчезают. – Ekaterina1234

+0

Проблема заключается в том, что вы меняете значение глобальной переменной, поэтому каждый раз, когда 'draw()' называется его значением, начинается с того места, где оно было остановлено в последний раз, и его часто называют _very_. Используйте локальную переменную, которая инициализируется значением глобального в начале функции. – martineau

+0

Спасибо @martineau, это сработало! – Ekaterina1234

1

Похоже, ваша draw функции вызываются в бесконечном цикле, вероятно, здесь: frame.set_draw_handler(draw) поэтому вы должны Lookup этой функции кадра.

Также нет необходимости deck1 просто сделать: deck = range(8) * 2

0

Попробуйте этот цикл:

for card,count in enumerate(deck): 
    canvas.draw_text(str(card), (C_W * count+1/3, C_H - 25), 60, "White") 

Это предотвращает глобальное значение от изменения, и дает ожидаемый эффект.

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