После () команда отказывается работать (Tkinter) - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать al oop в 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()

Однако он просто не работает. Mainl oop не срабатывает, и ошибок не появляется.

Если это вообще имеет значение, я кодирую на Chromebook в IDLE. Заранее спасибо.

ПРИМЕЧАНИЕ. Мой исходный код действительно открывает фреймы, виджеты, холст и т.п., это всего лишь быстрая и упрощенная версия.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Давайте сначала посмотрим, как определяется after:

after (ms, func = None, * args) метод экземпляра tkinter.Tk Вызов функции один раз после заданное время.

Чтобы достичь эффекта al oop, вы должны запланировать событие 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.
0 голосов
/ 26 мая 2020

Когда я пытался запустить ваш код, у меня возникли некоторые проблемы ...

tk.Tk - это тип, для создания и экземпляра используйте tk.Tk()

Первая ошибка: AttributeError: 'int' object has no attribute 'tk', Я нашел здесь возможный ответ { ссылка } и изменил root = tk.Tk на root = tk.Tk(), чтобы создать экземпляр Tk. Если это не то, что вы намеревались сделать, извините!

Func() попытался получить доступ к глобальному

UnboundLocalError: local variable 'a' referenced before assignment. a был определен до Func(), и к нему нельзя было получить доступ из функции. Чтобы исправить это, добавьте global a внутри функции (но с точки зрения новичка я думаю, вы можете быть осторожны с использованием глобальных переменных. Возможно, измените его на параметр)

not a == 5 никогда не запускался

Код запущен, но ничего не печатается. Чтобы проверить, работает ли функция, я изменил a = 5 на a = 0, чтобы он печатал что-то 5 раз. После пятикратной печати while-l oop больше не срабатывает, потому что условие not a == 5 больше не выполняется, а a можно изменить только (начиная с этого кода) изнутри этого l oop.

Вот еще раз ваш код с изменениями.

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()

Надеюсь, это было то, что вы искали!

...