【问题标题】:After() Command Refuses to Work (Tkinter)After() 命令拒绝工作 (Tkinter)
【发布时间】:2020-09-12 15:02:00
【问题描述】:

我试图在 Tkinter 中创建一个循环,所以我很自然地转向了 .After。这是我第一次使用 Tkinter,也是我第一次使用 .After。尽管检查了至少十几个网站,但我无法让它工作。这是我的代码的简化再现:

import tkinter as tk
from tkinter import * 
from tkinter.ttk import *
root = tk.Tk
a = 5
def Func():

    while not a == 5:
        print ('A does not equal five.')
        a += 1
root.after(0, Func)
root.mainloop()

但是,它根本不起作用。主循环不会触发,也不会出现任何错误。

如果这很重要,我会在 Chromebook 上的 IDLE 上编写代码。提前致谢。

注意:我的原始代码确实打开了框架、小部件、画布等,这只是一个快速简化的版本。

【问题讨论】:

  • 在您的情况下使用after() 的目的是什么?由于after(0, ...)没有意义,你可以直接调用Func()
  • mainloop 没有触发:你没有获得根窗口吗?这:while not a == 5: evals 为True,因此没有`print(...`

标签: python tkinter while-loop


【解决方案1】:

当我尝试运行您的代码时,我遇到了一些问题......

tk.Tk 是一个类型,创建和实例使用tk.Tk()

第一个错误: AttributeError: 'int' object has no attribute 'tk', 我在这里找到了可能的答案 https://stackoverflow.com/a/45234933/6934388 并将root = tk.Tk 更改为root = tk.Tk() 以创建一个Tk 实例。如果这不是您打算做的,对不起!

Func() 试图访问全局

UnboundLocalError: local variable 'a' referenced before assignmentaFunc() 之前定义,无法从函数内部访问。要解决此问题,请在函数内添加global a(但从初学者的角度来看,我认为您可能需要小心使用全局变量。也许将其更改为参数)

not a == 5 从未被解雇

代码现在运行,但没有打印任何内容。为了测试该功能是否有效,我将 a = 5 更改为 a = 0 以使其打印 5 次。打印 5 次后,while 循环不再触发,因为条件 not a == 5 不再满足,a 只能(在此代码中)在该循环内更改。

这又是你的代码,有改动。

import tkinter as tk
from tkinter import * 
from tkinter.ttk import *

root = tk.Tk() # Tk() to create an instance!
a = 0

def Func():
    global a # a is global

    while not a == 5:
        print ('A does not equal five.')
        a += 1

root.after(0, Func)
root.mainloop()

希望这就是你要找的东西!

【讨论】:

  • 哦,好吧...我在大约一分钟内创建了它,可能应该付出更多的努力,抱歉。但是,我的实际问题有代码有效,.after 函数是那里的问题。
  • 当你运行代码时,Tkinter 窗口也不显示吗?
  • 再一次,这是我的实际代码......我太自觉了,无法展示它,对不起,如果这让事情变得困难。但基本上我只需要对 after 语句的一个很好的解释,我检查了十几个网站都没有帮助。
  • 据我了解after 方法,它所做的只是提前计划方法的执行。然后,如果您希望它循环,您可以在方法本身中重新规划它。您有一个主“根”对象Tk(),它可以使用after 方法安排函数的执行。你使用它的方式是正确的,除了在你的函数中使用一个while循环,它可能会暂停程序直到循环停止。
【解决方案2】:

我们先来看看after是怎么定义的:

之后(毫秒,func=None,*args) tkinter.Tk 实例的方法 在给定时间后调用一次函数。

为了达到循环效果,你必须在你定义的函数中安排一个after事件,这样函数就会递归地调用自己,直到满足条件。它应该看起来像这样:

import tkinter as tk

root = tk.Tk()

a = 0

def func(n):
    if n!=5:
        print (f'A is {n} and does not equal five.')
        n += 1
        root.after(1000, func, n)

func(a)

root.mainloop()

结果:

A is 0 and does not equal five.
A is 1 and does not equal five.
A is 2 and does not equal five.
A is 3 and does not equal five.
A is 4 and does not equal five.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2019-01-12
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多