tkinter:如何使用after方法

2024-05-10 13:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我是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()

有人能帮帮我吗?问题肯定是框架。在(500)之后: 我不确定使用“frame”是否正确,我也不知道500之后的论点是什么。

谢谢


Tags: textfromimportl1tkinterrandomrootframe
1条回答
网友
1楼 · 发布于 2024-05-10 13:20:40

您需要将一个要在延时后调用的函数作为^{}的第二个参数:

after(delay_ms, callback=None, *args)

Registers an alarm callback that is called after a given time.

所以你真正想做的是:

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的调用来调度要再次调用的函数,因为after只执行给定的函数一次。文件中也提到了这一点:

The callback is only called once for each call to this method. To keep calling the callback, you need to reregister the callback inside itself

注意,一旦您用完了tiles_letter中的所有条目,您的示例将抛出一个异常,因此您需要更改逻辑,以便以任何方式处理该情况。最简单的方法是在add_letter开头添加一个检查,以确保列表不为空,如果列表为:

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

相关问题 更多 >