tkinter:方法后如何使用

时间:2014-09-09 21:10:52

标签: python user-interface tkinter pycharm

嘿,我是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后面的参数是什么。

由于

2 个答案:

答案 0 :(得分:32)

你需要在时间延迟后调用一个函数作为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

答案 1 :(得分:0)

我相信,500ms 在后台运行,而其余代码继续执行并清空列表。

然后在 500 毫秒后什么也没有发生,因为调用后没有实现函数调用(与 frame.after(500, function=None) 相同)