Python-tkinter:后方法如何使用

发布于 2021-02-02 23:20:14

正在将tkinter用于gui,我在使用之后方法时遇到麻烦。目的是使每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后面是哪个参数。

关注者
0
被浏览
61
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    您需要给定一个在时间延迟后要调用的函数,作为第二个参数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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看