当前位置: 首页 > 知识库问答 >
问题:

tkinter:如何使用后方法

楚宏胜
2023-03-14

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

谁能帮帮我吗?问题肯定出在框架上。(500)之后:我不确定使用“frame”是否正确,我不知道500后面的参数是什么。

谢啦

共有2个答案

鲁峰
2023-03-14

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

然后在500毫秒之后什么也不会发生,因为在after callup中没有实现函数调用(与帧相同。after(500,function=None)

霍财
2023-03-14

你需要给出一个函数在时间延迟后被调用,作为之后的第二个参数:

after(延迟,回调=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的开头添加一个检查,以确保列表不是空的,如果是:

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

 类似资料:
  • 问题内容: 正在将tkinter用于gui,我在使用之后方法时遇到麻烦。目的是使每5秒出现一个随机字母。 这是我的代码: 有人可以帮我吗—问题肯定是frame.after(500):我不确定使用“ frame”是否正确,我也不知道500后面是哪个参数。 问题答案: 您需要给定一个在时间延迟后要调用的函数,作为第二个参数after: 注册在给定时间后调用的警报回调。 因此,您真正想要做的是: 您还需

  • 问题内容: 我在停止“供稿”时遇到问题;cancel参数似乎对after方法没有任何影响。尽管“进纸停止”已打印到控制台。 我尝试使用一个按钮将启动供稿,而另一个按钮将停止供稿。 随着输出: 问题答案: 问题是,即使你打电话与停止循环,已经有等待消防挂起的工作。按下停止按钮不会触发新的作业,但是旧的作业仍然存在,并且当它自己调用时,它将传入False,这将导致循环继续。 您需要取消待处理的作业,以

  • 问题内容: 我需要使用Python的tkinter库编写程序。 我的主要问题是我不知道如何创建计时器或类似 的时钟hh:。 我需要它来更新自身(这是我不知道该怎么做的)。 问题答案: 根窗口具有一种称为的方法,该方法可用于安排给定时间段后要调用的函数。如果该函数本身调用,则您已设置了一个自动重复事件。 这是一个工作示例: 请记住,这不能保证该功能将完全按时运行。它仅计划在给定的时间后运行作业。由于

  • 问题内容: 我正在使用Python 3.3和tkinter制作用于行人逃生模拟的GUI界面。 我已经编写了两个模拟程序,它们运行良好。但是,当尝试从主应用程序调用它们时,我陷入了困境。我希望模拟窗口出现在单独的窗口中(创建主窗口的子窗口)。 如何使用tkinter从主应用程序启动子窗口? 问题答案: 您可以通过创建的实例来创建子窗口。有关更多信息,请参见http://effbot.org/tkin

  • 问题内容: 我不断收到以下错误:AttributeError:’NoneType’对象没有属性’configure’ 问题答案: 执行时,分配给该命令的结果是命令的结果, 而不是 对创建的对象的引用。 您需要在打包/网格化之前分配变量。它看起来应该像这样:

  • 我正在使用python创建一个控制Tkinter窗口的类对象。我的代码如下所示: 我希望能够启动一个类的实例,然后像这样停止它: 一切正常,窗口在上成功创建,单击按钮并执行时窗口消失。问题是主循环继续运行。我必须使用Ctrl C手动杀死程序,它显示它在。 如果我只是在一个普通的文件中而不是在一个类中执行所有tkinter代码,那么一切都是一样的,但是当我在root上调用destroy时,mainl