Вопрос

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

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

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

Это было полезно?

Решение

Чтобы ответить на конкретный вопрос о том, «Как вызвать событие 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)

Другие советы

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

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

w.event_generate (последовательность, ** кВт)

  

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top