Python/tkinter, binding e widget state : una perplessità

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Python/tkinter, binding e widget state : una perplessità

Messaggio da nuzzopippo »

I miei saluti.

Per mero esercizio sto sviluppando (in doppia versione tkinter/wxPython) una piccola applicazione mirata ad effettuare alcune "operazioni" con i pdf.

Ho definito una classe per una particolare finestra destinata a salvare/manipolare del testo estratto da un pdf, direttamente o tramite ocr, che può sussistere in due stati differenti "text" o "csv" il cui valore viene fornito quale parametro ed è memorizzato in una variabile di istanza, il secondo "stato" sussiste in una nuova istanza della classe effettuata da una finestra di stessa classe tramite un button che in condizione "csv" è disabilitato.

Il pulsante è impostato per agire tramite clic del pulsante sinistro del mouse ovvero pressione del return su tatiera o tastierino numerico nella sottostante modalità :

Codice: Seleziona tutto

        # bindings
        self.bt_edit.bind('<Button-1>', self._on_edit)
        self.bt_edit.bind('<Return>', self._on_edit)
        self.bt_edit.bind('<KP_Enter>', self._on_edit)
...
    def _on_edit(self, evt):
        if self.csv_win == None or not self.csv_win.winfo_exists():
            self.csv_win = TextUtility(self, type='csv')
        self.edit = True
        self._def_max_len()
        self._evaluate_context()
Mi sono accorto che malgrado il pulsante sia disabilitato gli eventi definiti hanno comunque luogo ed una finestra in stato "csv" crea una nuova finestra nello stesso stato facendo clic sul widget disabilitato, vedi figura
Immagine
Pur avendo trovato facilmente varie soluzioni, l'evento anomalo non avviene se:
1 - definisco "command=self._on_edit" alla creazione del pulsante;
2 - verificando preventivamente lo stato nel callback;
3 - effettuando lo unbinding nel caso lo stato sia "csv"

Codice: Seleziona tutto

        #if self.type == 'csv':
        #    self.bt_edit.unbind('<Button-1>')
        #    self.bt_edit.unbind('<Return>')
        #    self.bt_edit.unbind('<KP_Enter>')
quanto sopra mi ha sbalordito, dato che ritenevo un pulsante in condizione "disabled" non reattivo, e sto cercando di capire il "perché" accada da un paio di giorni ma non mi è riuscito di venirne a capo ... qualcuno saprebbe darmi una indicazione su dove andare a guardare?

Grazie dell'attenzione.
Fatti non foste a viver come bruti ...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 17 ospiti