Tkinter: вызывать событие в основном цикле

Как вы вызываете tkinter event из отдельного объекта?

Я ищу что-то вроде wxWidgets wx.CallAfter. Например, если я создаю объект и передаю ему свой корневой экземпляр Tk, а затем попытаюсь вызвать метод этого корневого окна из моего объекта, приложение заблокируется.

Лучшее, что я могу придумать, это использовать метод after и проверить статус с моего отдельного объекта, но это кажется расточительным.

Ответы

Ответ 1

Чтобы ответить на ваш конкретный вопрос "Как вы вызываете событие TkInter из отдельного объекта", используйте команду event_generate. Это позволяет вам вводить события в очередь событий корневого окна. В сочетании с мощным механизмом виртуальных событий Tk он становится удобным механизмом передачи сообщений.

Например:

from tkinter import *

def doFoo(*args):
    print("Hello, world")

root = Tk()
root.bind("<<Foo>>", doFoo)

# some time later, inject the "<<Foo>>" virtual event at the
# tail of the event queue
root.event_generate("<<Foo>>", when="tail")

Обратите внимание, что вызов event_generate будет немедленно возвращен. Не понятно, что вы хотите или нет. Вообще говоря, вы не хотите, чтобы программа, основанная на событиях, блокировала ожидание ответа на конкретное событие, потому что она заморозит графический интерфейс.

Я не уверен, что это решает вашу проблему; не видя своего кода, я не уверен, какова ваша настоящая проблема. Я могу, например, получить доступ к корням в конструкторе объекта, где корневой каталог передается без блокировки приложения. Это говорит мне, что в вашем коде есть что-то еще.

Здесь приведен пример успешного доступа к методам в корневом окне из другого объекта:

from tkinter import *

class myClass:
    def __init__(self, root):
        print("root background is %s" % root.cget("background"))

root = Tk()
newObj = myClass(root)

Ответ 2

Здесь ниже только какой-то документ и ссылка, чтобы лучше понять Брайана выше.

описание функции из Технология Нью-Мексико:

w.event_generate(sequence, **kw)

Этот метод вызывает запуск события без какого-либо внешнего стимула. Обработка события такая же, как если бы он был вызван внешним стимулом. Аргумент последовательности описывает событие, которое должно быть запущено. Вы можете установить значения для выбранных полей в объекте Event, указав ключевые слова = значения, где ключевое слово задает имя поля в объекте Event.

список и описание атрибутов событий tcl/tk здесь