Tkinter: вызвать событие в основном цикле - PullRequest
16 голосов
/ 07 ноября 2008

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

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

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

Ответы [ 2 ]

30 голосов
/ 09 ноября 2008

Чтобы ответить на конкретный вопрос «Как вызвать событие 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 будет немедленно возвращен. Непонятно, хочешь ты этого или нет. Вообще говоря, вы не хотите, чтобы программа, основанная на событиях, блокировала ожидание ответа на конкретное событие, потому что она остановит графический интерфейс .

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

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

from tkinter import *

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

root = Tk()
newObj = myClass(root)
6 голосов
/ 21 апреля 2016

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

описание функции от New Mexico Tech :

w.event_generate(sequence, **kw)

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

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

...