2014-10-07 19 views
0

我希望這幾個字母每隔幾秒在屏幕上逐一顯示。出於某種原因,當我使用「後續方法」時,它會等待所有字母在內部加載,然後顯示屏幕上已包含所有字母。這意味着它將等待15秒,然後載入屏幕上的所有字母。 (我希望我解釋清楚)python:在方法之後 - 屏幕已經加載了所有內容

這是我的工作

class Game(): 

    def __init__(self): 

     root = Tk() 

     root.geometry("1350x730") 

     global tile_frame_column # the labels that go on the screen of letters 
     tile_frame_column = {} 

     boardh = [[False for x in range(12)] for y in range(12)] 

     tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

     def drawBoard(): 
      tile_frame_column_counter=0 
      for x in range(8): 
       for y in range(8): 

        if not tiles_letter: 
         return 
        if not boardh[y][x]: 
         rand = random.choice(tiles_letter) 
         tile_frame_column[tile_frame_column_counter] = Label(root, text=rand, font="Helvetica 16 bold") 
         tile_frame_column[tile_frame_column_counter].place(x=(x)*64+5, y= (y)*64) 
         tile_frame_column_counter+=1 
         tiles_letter.remove(rand) 
         root.after(10000, drawBoard) 
     root.after(10000, drawBoard) 
     root.mainloop() 

app=Game() 

我一直停留在這一段時間。希望有人能幫忙。 由於

回答

1

好了,所以凱文把你中途,但同時加載所有字母的問題是不是由於使用after功能,它是產生所有的字母drawBoard由於一個行程中,你具有對for語句改變in range(1)這樣的:

  for x in range(1): 
       for y in range(1): 

這使得在時間1個信,但它們被放置在相同的位置(即在彼此的頂部)。

爲了解決這個問題,我建議你稍微改變一下你的方法。爲每次運行drawBoard時創建兩個變量(對於x和y座標)。這是一個完整的例如

from tkinter import * 
import random 

class Game(): 
    def __init__(self): 
     root = Tk() 
     root.geometry("1350x730") 

     global tile_frame_column # the labels that go on the screen of letters 
     tile_frame_column = {} 

     global tile_frame_column_counter 
     global newvar1 # x coordinate 
     global newvar2 # y coordinate 

     tile_frame_column_counter = 0 
     newvar1 = 50 
     newvar2 = 50 

     tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

     def drawBoard(): 
      global tile_frame_column_counter 
      global newvar1 
      global newvar2 
      for x in range(1): 
       for y in range(1): 
        if not tiles_letter: 
         return 
        else: 
         rand = random.choice(tiles_letter) 
         tile_frame_column[tile_frame_column_counter] = Label(root, text=rand, font="Helvetica 16 bold") 
         tile_frame_column[tile_frame_column_counter].place(x = newvar1, y = newvar2) 
         tile_frame_column_counter+=1 
         if newvar2 > 300: 
          newvar1 += 50 
          newvar2 = 50 # to start at the next column 
         else: 
          newvar2 += 50 
         tiles_letter.remove(rand) 
         root.after(1000, drawBoard) 
     root.after(1000, drawBoard) 
     root.mainloop() 

app=Game() 

我認爲這就像你在五個左右的字母后將標籤放在下一列。

希望這個作品!如果不告訴我還有什麼需要:)

+0

感謝這正是我所需要的。 – user2456977 2014-10-08 17:55:07

2
root.after(10000, drawBoard()) 

after的第二個參數被認爲是一個功能對象。但你在這裏做的是說,「馬上調用drawBoard,它的返回值將是after的第二個參數」。嘗試它沒有括號。

root.after(10000, drawBoard) 

(記住要改變after呼叫都使用它的點)


此外,在您的drawBoard功能,root.after將調用8 * 8倍,所以所有的後續調用將同時執行。如果您想要drawBoard填寫單個單元格,請等待X秒,填入單個單元格,等待X秒等,然後在您第一次成功填入單元格後應該爲return。此外,您忘記填寫完整的信件boardh

#rest of function goes here... 
tile_frame_column[tile_frame_column_counter].place(x=(x)*64+5, y= (y)*64) 
tile_frame_column_counter+=1 
tiles_letter.remove(rand) 
boardh[y][x] = rand 
root.after(1000, drawBoard) 
return 
+0

謝謝!但它仍然同時加載字母。儘管如此,我將編輯上面的代碼。但這是一個重大的改進,但現在它加載屏幕 – user2456977 2014-10-07 18:15:49

+0

。它保持空白15秒。 15秒後,所有字母一次出現在屏幕上。 – user2456977 2014-10-07 18:19:46

相關問題