Domanda

Come si invoca un tkinter evento da un oggetto separato?

Sto cercando qualcosa come wxWidgets wx.CallAfter . Ad esempio, se creo un oggetto e gli passo la mia istanza di root Tk , quindi provo a chiamare un metodo di quella finestra di root dal mio oggetto, la mia app si blocca.

Il meglio che posso trovare è usare il metodo after e controllare lo stato dal mio oggetto separato, ma questo sembra dispendioso.

È stato utile?

Soluzione

Per rispondere alla tua domanda specifica di " Come invocare un evento TkInter da un oggetto separato " ;, usa il comando event_generate . Ti consente di iniettare eventi nella coda degli eventi della finestra principale. In combinazione con il potente meccanismo di eventi virtuali di Tk, diventa un pratico meccanismo di passaggio dei messaggi.

Ad esempio:

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

Nota che la chiamata event_generate tornerà immediatamente. Non è chiaro se è quello che vuoi o no. In generale, non si desidera che un programma basato su eventi blocchi l'attesa di una risposta a un evento specifico perché bloccherà la GUI .

Non sono sicuro se questo risolva il tuo problema; senza vedere il tuo codice non sono sicuro di quale sia il tuo vero problema. Ad esempio, posso accedere ai metodi di root nel costruttore di un oggetto in cui viene passato il root senza che l'app si blocchi. Questo mi dice che sta succedendo qualcos'altro nel tuo codice.

Ecco un esempio di accesso riuscito ai metodi su una finestra radice da qualche altro oggetto:

from tkinter import *

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

root = Tk()
newObj = myClass(root)

Altri suggerimenti

Di seguito solo alcuni documenti e link per comprendere meglio la risposta di Bryan sopra.

descrizione della funzione da New Mexico Tech :

w.event_generate (sequenza, ** kw)

  

Questo metodo provoca l'attivazione di un evento senza stimoli esterni. La gestione dell'evento è la stessa di se fosse stata innescata da uno stimolo esterno. L'argomento della sequenza descrive l'evento da attivare. Puoi impostare i valori per i campi selezionati nell'oggetto Event fornendo argomenti keyword = value, dove la parola chiave specifica il nome di un campo nell'oggetto Event.

elenco e descrizione degli attributi dell'evento tcl / tk qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top