web-dev-qa-db-ja.com

tkinter:afterメソッドの使用方法

ちょっとpythonで、guiにtkinterを使用しています。 "after"メソッドの使用に問題があります。目標は5秒ごとにランダムな文字を表示することです。

ここに私のコードがあります:

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

誰かが私を助けてくれますか?---問題は間違いなくframe.after(500)です: "frame"を使用するのが正しいかどうかわかりません。どの引数が500に続くかわかりません。

ありがとう

26
user2456977

after の2番目の引数として、遅延後に呼び出される関数を指定する必要があります。

after(delay_ms、callback = None、* args)

指定された時間後に呼び出されるアラームコールバックを登録します。

あなたが本当にやりたいことはこれです:

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

afterは指定された関数を1回だけ実行するため、コールバック関数内でafterへの呼び出しを繰り返して、関数が再度呼び出されるようにスケジュールする必要もあります。これは、ドキュメントにも記載されています。

コールバックは、このメソッドの呼び出しごとに1回だけ呼び出されます。コールバックの呼び出しを続けるには、コールバック自体を再登録する必要があります

tiles_letterのすべてのエントリを使い果たすとすぐに例が例外をスローすることに注意してください。そのため、ロジックを変更して、そのケースを自由に処理する必要があります。最も簡単なことは、リストが空でないことを確認するためにadd_letterの先頭にチェックを追加し、次の場合はreturnを追加することです。

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
35
dano