【问题标题】:label widget not updating with 'after' method in Tkinter for-loop标签小部件未使用 Tkinter for-loop 中的“后”方法更新
【发布时间】:2013-03-23 19:41:49
【问题描述】:

我正在尝试更新 tkinter 中 for 循环的文本并在其中显示标签。根据 .after 方法,这应该在一秒钟后发生。

def rightString(self, gro, string):
    for z in string:
        self.message2.configure(text="Good job, %s is a member of %s!" % (z, gro.getName()))

        root.after(1000)
        self.message2.grid()
        print(z, " should be displayed!")

我希望这是足够的信息;我觉得我缺少一些非常基本的东西。 print 函数在 IDLE 中调用并显示 'string' 的每个成员。我不明白为什么 self.message2 不显示。它显示在脚本的其他不包含“after”方法的部分。

如果有必要,我会发布更多代码。

谢谢。

【问题讨论】:

  • self.message2.configure() 就足够了——你不必再打电话给self.message2.grid()
  • @A.Rodas 我认为这不会影响结果。我只是试了一下,没有再次调用grid,没有用。

标签: time python-3.x tkinter


【解决方案1】:

如果你想每秒更改标签的文本,那么你必须用after再次调度函数:

def rightString(self, gro, string):
    if string:
        z = string[0]
        self.message2.configure(text="Good job, %s is a member of %s!" % (z, gro.getName()))
        root.after(1000, lambda: self.rightString(gro, string[1:])
        print(z, " should be displayed!")

正如我在评论中所说,每次更改文本时都不需要调用grid()


编辑:要在所有字符串的处理完成后执行不同的函数,您可以在 else 块中添加对它的调用:

def rightString(self, gro, string):
    if string:
        # ...
    else:
        doSomethingElse()

【讨论】:

  • 我将此方法用作类的一部分,并且在方法调用之后有几个命令。由于某种原因,此方法被调用一次,字符串 [0] 被显示,然后它直接跳转到类中的以下命令。它仅在之后继续通过“字符串”列表。你知道我可以如何修改它,使其在完成之前不会继续超过 def rightString 吗?谢谢。
  • @DavidJ。我已经为我的答案添加了一个可能的解决方案。
  • 您使用了“递归”这个词,但这并不是真正的递归(对某些人来说它具有负面含义)。该函数不调用自己,该函数只是将自己放入队列中,稍后由事件循环调用。
  • @BryanOakley 没错,严格来说这不是递归——我不明白为什么它会对某人产生负面影响。
  • @A.Rodas:递归被许多人误解,而我们这些曾多次接触过该区块的人都知道它落入坏人手中是很危险的。 (* 我以前不认为这是真的,但我发誓,我的团队采访的 75% 的人不会写出最简单的递归程序)。
【解决方案2】:

它不会显示,因为您正在阻止事件循环处理事件,特别是导致它在屏幕上重绘窗口的事件。您需要重组代码以避免仅使用单个参数调用 after

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多