2014-09-09 14 views
15

Hey ich bin neu zu Python und bin mit Tkinter für meine GUI. Ich habe Probleme mit der "Nachher" -Methode. Das Ziel ist es, einen zufälligen Buchstaben erscheinen alle 5 Sekunden.tkinter: wie nach Methode

ist hier mein Code:

import random 
import time 
from tkinter import * 


root = Tk() 

w = Label(root, text="GAME") 
w.pack() 

frame = Frame(root, width=300, height=300) 
frame.pack() 

L1 = Label(root, text="User Name") 
L1.pack(side=LEFT) 
E1 = Entry(root, bd =5) 
E1.pack(side=LEFT) 


tiles_letter = ['a', 'b', 'c', 'd', 'e'] 


while len(tiles_letter) > 0: 
    rand = random.choice(tiles_letter) 
    tile_frame = Label(frame, text=rand) 
    tile_frame.pack() 
    frame.after(500) 
    tiles_letter.remove(rand) # remove that tile from list of tiles 

root.mainloop() 

kann mir jemand bitte helfen --- das Problem auf jeden Fall frame.after ist (500): Ich bin nicht sicher, ob es richtig ist „Rahmen“ zu verwenden, und ich weiß nicht, was das Argument folgt den 500.

Dank

Antwort

23

Sie müssen eine Funktion geben, nach der Zeitverzögerung aufgerufen werden als das zweite Argument zu after:

nach (delay_ms, Rückruf = None, * args)

Register einen Alarm Rückruf, der nach einer gegebenen Zeit aufgerufen wird.

Also, was Sie wirklich tun möchte, ist dies:

tiles_letter = ['a', 'b', 'c', 'd', 'e'] 

def add_letter(): 
    rand = random.choice(tiles_letter) 
    tile_frame = Label(frame, text=rand) 
    tile_frame.pack() 
    root.after(500, add_letter) 
    tiles_letter.remove(rand) # remove that tile from list of tiles 


root.after(0, add_letter) # add_letter will run as soon as the mainloop starts. 
root.mainloop() 

Sie müssen auch die Funktion Zeitplan wieder aufgerufen werden, indem Sie den Anruf an after innerhalb der Callback-Funktion zu wiederholen, da after nur das ausführt gegebene Funktion einmal. Dies wird auch in der Dokumentation vermerkt:

Der Rückruf wird für jeden Aufruf dieser Methode nur einmal aufgerufen. Damit den Rückruf anrufen, müssen Sie den Rückruf innerhalb selbst

Hinweis neu zu registrieren, dass Ihr Beispiel wird, sobald eine Ausnahme werfen, wie Sie alle Einträge in tiles_letter ausgeschöpft haben, so müssen Sie Ihre Logik ändern um diesen Fall so zu behandeln, wie Sie wollen. Die einfachste Sache wäre eine Überprüfung am Anfang add_letter hinzufügen, um sicherzustellen, dass die Liste nicht leer ist, und nur return, wenn er:

def add_letter(): 
    if not tiles_letter: 
     return 
    rand = random.choice(tiles_letter) 
    tile_frame = Label(frame, text=rand) 
    tile_frame.pack() 
    root.after(500, add_letter) 
    tiles_letter.remove(rand) # remove that tile from list of tiles 
+2

Sie brauchen nicht zu verwenden 'after' es zu nennen das erste Mal, besonders wenn du 'nach (0, ...) 'machst. –