tkinter: как использовать после метода

Эй, я новичок в python и использую tkinter для своего gui. У меня возникли проблемы с использованием метода «после». Цель состоит в том, чтобы сделать случайную букву каждые 5 секунд.

Вот мой код:

  • Как сделать gui в python
  • Текст по умолчанию, а также список textvariable Виджет ввода Tkinter
  • Как реализовать минимальный сервер для AJAX в Python?
  • Вход в графический интерфейс на основе текста Python (TUI)
  • Приложение tkinter добавляет контекстное меню правой кнопки мыши?
  • Python tkinter - как удалить все дочерние элементы?
  • 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): я не уверен, правильно ли использовать «фрейм», и я не знаю, какой аргумент следует за 500.

    благодаря

  • Приложение tkinter добавляет контекстное меню правой кнопки мыши?
  • Процесс завершен с кодом выхода 139 после обновления с python 2.7.6 64 бит до 2.7.10 32 бит
  • Любой лучший способ сделать a = b + a?
  • Как я могу видеть сообщения журнала при модульном тестировании в PyCharm?
  • IDE PEcharm пытается загрузить сценарий django из sh вместо bash
  • pycallgraph с pycharm не работает
  • One Solution collect form web for “tkinter: как использовать после метода”

    Вы должны дать функцию, которая будет вызываться после временной задержки, как второй аргумент 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 
    Python - лучший язык программирования в мире.