Vraag tkinter: hoe te gebruiken na methode


Hallo, ik ben een nieuwe gebruiker van python en gebruik tkinter voor mijn gui. Ik heb problemen met het gebruik van de "na" -methode. Het doel is om elke 5 seconden een willekeurige letter te laten verschijnen.

Hier is mijn 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()

kan iemand me alsjeblieft helpen --- het probleem is zeker frame.after (500): ik weet niet zeker of het correct is om "frame" te gebruiken en ik weet niet wat welk argument de 500 volgt.

Bedankt


16
2017-09-09 21:10


oorsprong


antwoorden:


U moet een functie opgeven die na de vertraging moet worden aangeroepen als het tweede argument voor after:

after (delay_ms, callback = None, * args)

Registreert een alarmoproep die na een bepaalde tijd wordt gebeld.

Dus wat je echt wilt doen is dit:

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()

U moet ook de functie opnieuw roosteren door de oproep naar te herhalen after in de callback-functie, sinds after voert slechts eenmaal de gegeven functie uit. Dit staat ook in de documentatie:

De callback wordt slechts één keer gebeld voor elke oproep naar deze methode. Houden   callback bellen, moet u de callback opnieuw inschrijven   zelf

Houd er rekening mee dat uw voorbeeld een uitzondering oplevert zodra u alle items hebt leeggemaakt tiles_letter, dus je moet je logica aanpassen om die zaak op elke gewenste manier af te handelen. Het eenvoudigste zou zijn om aan het begin een vinkje te plaatsen add_letter om ervoor te zorgen dat de lijst niet leeg is en rechtvaardig return als het is:

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

24
2017-09-09 21:19