tkinter:如何使用后方法

问题描述 投票:27回答:1

嘿,我是python新手,正在使用tkinter做我的gui。我在使用 "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后面的参数是什么。

谢谢你的帮助

python user-interface tkinter pycharm
1个回答
39
投票

你需要给出一个在延时后调用的函数作为第二个参数。after:

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 内的回调函数,因为 after 只执行给定函数一次。这在文档中也有说明。

每次调用这个方法时,回调只被调用一次。如果要继续调用回调,你需要在自身内部重新注册回调。

请注意,一旦你用完了 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

Live -Demo: repl.it

© www.soinside.com 2019 - 2024. All rights reserved.