Topic: Interazione tra software di supervisione e interfaccia grafica  (Letto 245 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline CodeCruncher

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Buongiorno a tutti e anche agli altri.
Negli esempi che trovo nella rete relativi all'uso di Tkinter, tutto il codice è relativo all'interazione dell'utente con tasti e altri widget.
In altre parole, tutto il codice descrive la reazione alla pressione di un tasto o alla scelta di una voce da una lista, o cose del genere,.
Io vorrei scrivere un programma che scandisca una linea seriale, comunicando con delle periferiche, e riporti lo stato di dette periferiche (presenti o assenti) tramite un array di tasti, cambiandone il colore. Ad esempio, se la terza periferica non risponde, il terzo tasto deve diventare rosso.
Come integrare la parte di scansione della linea seriale con l'interfaccia grafica?
Esempio ancora più semplice: in una finestra vi sia un solo tasto; lo si vuole far diventare rosso o verde tramite input da tastiera.
Answer = raw_input("Inserire un carattere")
if Answer == "":
    #Se stringa nulla, cambiare il colore del tasto in rosso
else:
    #Altrimenti cambiare il colore del tasto in verde

Scusate se la richiesta è banale, ma ho appena iniziato a studiare Tkinter.
Grazie.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.154
  • Punti reputazione: 9
    • Mostra profilo
Re:Interazione tra software di supervisione e interfaccia grafica
« Risposta #1 il: Maggio 12, 2020, 18:34 »
Beh sì, questo sarebbe in effetti tutto il problema di scrivere un'applicazione GUI... cioè, non tanto la parte "GUI", quanto la parte "applicazione". Se la guardi da un punto di vista MCV, un tipico gui framework come Tkinter, o altro, ti mette a disposizione due servizi:
- la "view", ovvero le finestre, i pulsanti e così via. Questa è la parte ovvia;
- il "controller", ovvero un meccanismo di notifica che ti avverte delle interazione dell'utente con la view. Questo meccanismo è basato essenzialmente su un main loop che sorveglia i vari elementi della GUI. Tu puoi registrare delle funzioni "callback", ovvero puoi chiedere che il main loop chiami un certo callback ogni volta che l'utente compie una certa azione (un clic sul pulsante, per dire).

Da questo punto in poi, la logica del "model" devi scrivertela a manina, non è più il dominio del GUI framework. L'idea è partire dai callback come "ponte" con la tua logica di business. In pratica, per esempio, che cosa voglio che succeda quando l'utente fa clic su un pulsante? Voglio che succeda "questo e poi questo". Va bene, allora registra un callback in corrispondenza del clic di quel pulsante, e poi scrivi "questo e quest'altro" nel callback.  E vai avanti così...

Offline CodeCruncher

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Interazione tra software di supervisione e interfaccia grafica
« Risposta #2 il: Maggio 14, 2020, 16:58 »
Grazie, ma temo di non essermi spiegato bene.
Capisco la parte di interfaccia grafica e quella delle "azioni" che pulsanti e altri widget devono scatenare quando vi si interagisce.
Il mio problema è far condividere queste due cose con una parte di programma che gira indipendentemente dai widget.
Faccio un esempio. Disegno 10 pulsanti in una finestra; non associo alcuna azione alla loro pressione, semplicemente voglio cambiare il colore di uno di essi a scelta tramite un'immissione da tastiera.

from Tkinter import *

win = Tk()
b=[]
for i in range(1,10):
    b=b+[Button(win,text=str(i))]


for i in range(0,9):
    b.grid(row=0, column=i)

win.mainloop()

Answer = int(raw_input("Inserire numero del tasto da cambiare:"))
b[Answer].backgroud="green"

In questo modo, al lancio dello script ottengo la visualizzazione di tasti, ma non ho la richiesta di immissione dati. Dopo che ho chiuso la finestra, cliccando sulla X rossa, la finestra si chiude e il programma continua con la richiesta di immissione.
Se sposto l'istruzione win.mainloop() alla fine del programma, prima mi viene chiesta l'immissione, e solo dopo vengono disegnati i tasti, che però sono tutti grigi perchè al momento dell'immissione non esistevano ancora.
Io avrei bisogno che le due parti del programma (l'interfaccia grafica e l'immissione dei dati) "convivano". In altre parole, vorrei che venissero disegnati i tasti, mi venisse chiesto quale modificare, e che il tasto selezionato cambiasse colore di conseguenza.

« Ultima modifica: Maggio 14, 2020, 17:03 da CodeCruncher »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:Interazione tra software di supervisione e interfaccia grafica
« Risposta #3 il: Maggio 14, 2020, 19:42 »
...
Il mio problema è far condividere queste due cose con una parte di programma che gira indipendentemente dai widget.
...

Discreto problema, dato che tkinter, come per altro più o meno tutti i framework grafici esistenti, è basato su un thread unico bloccante, vale a dire che un eventuale processo in cui è inserito un tk.mainloop() si ferma sino a quando non si esce dal mainloop. In nessun caso potresti effettuare inserimenti "da tastiera" nello stesso processo che avvia tkinter.

Eventuali chiamate "parallele" devono essere invocate dall'interno di tkinter, con le modalità opportune (threading, multiprocessi, chiamate asincrone ...), dette chiamate "parallele" magari "potrebbero" avere dati inseriti da tastiera /che so, una comunicazione tra socket o altro)

Domanda frequente la Tua, fermo restando che il modo "giusto" per approcciarsi è quello già indicato da @RicPol, in questo post ho dato una risposta (alquanto empirica) su come aprire un thread funzionante "in parallelo" a tkinter.