2016-08-01 84 views
-2

我想寫一個循環遍歷列表。該清單是一副「卡片」。有16張牌,編號爲0 - 7。每個編號出現在列表中兩次。爲什麼這個循環不起作用

當我評論for循環時,程序在畫布左側正確顯示1張卡片。但是當我使用循環時,沒有顯示任何內容。代碼不完整,需要使用特定的在線軟件運行。下面是整個程序的鏈接。

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

我想用for循環來用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

@霍洛威的代碼不完整,但如果你按照我提供的鏈接,你就可以嘗試一下。 GUI上的按鈕調用new_game()函數 – Ekaterina1234

+3

好的。 [你可以編輯這個問題來反映這個問題嗎?](http://stackoverflow.com/help/mcve) – Holloway

回答

1

內您的版本加倍每次函數是全球C_W 16倍simplegui的draw()函數被調用每秒在for循環的代碼約60調用。這意味着它的價值很快變成天文數字,並且文字在銀河之外的某個地方從屏幕上向右移動。

這裏有一個簡單的方法來避免這樣的問題:

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

感謝@馬蒂奧,它的工作! – Ekaterina1234

1

它看起來像你的draw函數被調用一個無限循環,這裏大概: frame.set_draw_handler(draw)所以你應該查找該幀的功能。

而且不需要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") 

它可以防止不斷變化的全球價值,併爲您提供了預期的效果。