Topic: Esecuzione codice in blocco!!  (Letto 307 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Esecuzione codice in blocco!!
« il: Febbraio 24, 2020, 10:10 »
Buongiorno a tutti.....
nel mio modulo main, come prima cosa creo una finestra QWidget con immagine, progressBar e TextLabel per aggiornare l'utente sui procedimenti di avvio del software, ma nella prova di compilazione del codice, subito dopo avermi creato a monitor la windows, il codice si blocca e riparte solo dopo che chiudo con l'apposita icona ( X ) la windows!!!

Questo il codice della windows...

from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic

global appIntro

class Intro_ui(QWidget):
    def __init__(self):
        global appIntro
        appIntro = QApplication([])  # oggetto application
        super().__init__()
        uic.loadUi("..\\ReTaBo\\grafica\\introForm_ui.ui", self)

    def start(self):
        self.show()  # lo rendo visibile
        appIntro.exec()  # avvio l'oggetto application

    def increase(self, testo):
        # CODICE CHE INCREMENTA LA PROGRESSBAR E SCRIVE IN TEXTLABEL
        print("INCREMENTO PROGRESS BAR")
        print("/n" + testo)


Questo il codice nel modulo main......


if __name__ == '__main__':
    temp = wLog.w('###################### INIZIO MAIN retabo.py ######################')

    # INTRO GRAFICA
    intro = introReTaBo.Intro_ui()
    intro.start()

    # CHECK DIR E CARTELLE
    info = firstCheck.go(intro) # crea le cartelle e sottocartelle
    dirMain = info[0]
    temp += info[1]
    del info

#------------------------------------------------------------
log = open(dirMain+'docs\\logs\\fileLog_'+strClockDate.goF()+'.txt', 'a')
log.write('< ReTaBo >    file di log del: '+strClockDate.goT())
#------------------------------------------------------------
log.write(temp) # mando la stringa temp al log
del temp    # poi la cancello

#....segue alt codice!


Qualcuno può aiutarmi?
Avevo pensato all'uso dei Thread, ma non credo sia questo il problema!!
Grazie.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 334
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #1 il: Febbraio 24, 2020, 13:42 »
... subito dopo avermi creato a monitor la windows, il codice si blocca e riparte solo dopo che chiudo con l'apposita icona ( X ) la windows!!!...

Quello che Tu hai descritto è il comportamento normale di funzionamento dei framework grafici, di norma a singolo thread bloccante, capita così in tutti i framework grafici da me provati in tutti i linguaggi con forse unica eccezione lo AWT di java (non sono sicuro però) che però è di fatto stato sostituito da swing, bloccante anch'esso.

Devi cambiare architettura alla Tua applicazione, facendo precedere all'avvio della interfaccia grafica eventuali processi di inizializzazione occorrenti e rendendo metodi od istanze degli oggetti grafici il resto.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #2 il: Febbraio 24, 2020, 15:26 »
Grazie nuzzopippo.

Una soluzione potrebbe essere quella di rendere il modulo classe della windows introduttiva modulo main!! e da lì eseguire tutto il codice, moduli etc, dell'avvio del software.

Mi dici per cortesia come trovi il codice che ho scritto!? Cioè potrebbe essere scritto in modo migliore? (questo giudizio serve a me per comprendere meglio Python!)

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 334
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #3 il: Febbraio 24, 2020, 16:07 »
...
Una soluzione potrebbe essere quella di rendere il modulo classe della windows introduttiva modulo main!! e da lì eseguire tutto il codice, moduli etc, dell'avvio del software.
...

Potrebbe essere un modo, o potresti, anche, definire una funzione main che provvede ad eseguire eventuali inizializzazioni, istanziare l'interfaccia grafica e ad eventuali processi di "pulizia" conseguenti alla chiusura, dipende un po' da cosa dovresti fare.

In merito ad un giudizio, credo che comunque sia troppo "ridotto" il codice per crearsi una idea, inoltre, a parte che non ho mai guardato le QT, sarebbe arroganza da parte mia esprimere giudizi, in python sono solo un "apprendista", neanche troppo gagliardo, temo.

Un modo migliore? Mi è stato consigliato di studiarmi alcuni pattern di design delle applicazioni in generale, nello specifico MVC ed observer, ed è un consiglio che ritengo prezioso, lo passo a Te ... per altro, ho scoperto l'esistenza di molti altri pattern "progettuali" che avendo tempo ho tutta l'intenzione di vedermi con calma.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #4 il: Febbraio 24, 2020, 16:14 »
Un modo migliore? Mi è stato consigliato di studiarmi alcuni pattern di design delle applicazioni in generale, nello specifico MVC ed observer, ed è un consiglio che ritengo prezioso, lo passo a Te ... per altro, ho scoperto l'esistenza di molti altri pattern "progettuali" che avendo tempo ho tutta l'intenzione di vedermi con calma.
Grazie, gentilissimo. Potresti indirizzarmi meglio su questi pattern?

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 334
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #5 il: Febbraio 24, 2020, 18:16 »
Ho trovato pochissimo materiale utile in italiano, personalmente ho trovato utili i link che ho indicato in questo post per avere il "LA" sul discorso, trovato anche piacevole questo articolo riguardo l'argomento observer ... in entrambi i casi ho dovuto tradurmi tutto, prima di affrontare.

Il secondo link appartiene ad un sito che affronta il discorso di molteplici altri pattern.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #6 il: Febbraio 24, 2020, 18:33 »
Grazie mille,
proverò a leggerli tra una cosa e l'altra.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #7 il: Febbraio 24, 2020, 19:51 »
Non ci riesco  :angry:
Ho provato a modificare il codice così:

from ReTaBo.gestioneFiles import wLog, firstCheck, strClockDate, checkUfficio
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic

def prova(temp, windowsIntro):
    print("PROVA PROVA PROVA")
    info = firstCheck.go(windowsIntro)  # crea le cartelle e sottocartelle
    dirMain = info[0]
    temp += info[1]
    del info

    # ------------------------------------------------------------
    log = open(dirMain + 'docs\\logs\\fileLog_' + strClockDate.goF() + '.txt', 'a')
    log.write('< ReTaBo >    file di log del: ' + strClockDate.goT())
    # ------------------------------------------------------------
    log.write(temp)  # mando la stringa temp al log
    del temp  # poi la cancello

    # legge i dati dell'Ufficio
    checkUfficio.go(dirMain)

    # ====================================
    # ESEGUIRE IN CHIUSURA DI APPLICAZIONE
    log.write(wLog.w('log chiuso!!!'))
    log.close()

class Ui(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi("..\\ReTaBo\\grafica\\introForm_ui.ui", self)

if __name__ == '__main__':
    temp = wLog.w('###################### INIZIO MAIN retabo.py ######################')
    stepForPBar = 100//5 # settaggio degli step previsti per la progressBar

    appIntro = QApplication([])  # oggetto grafico application
    windowsIntro = Ui()  # creo oggetto gafico dalla classe Ui

    windowsIntro.show()  # lo rendo visibile
    if windowsIntro.isVisible(): prova(temp, windowsIntro)
    appIntro.exec()  # avvio l'oggetto application

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Esecuzione codice in blocco!!
« Risposta #8 il: Febbraio 25, 2020, 09:00 »
Ho corretto il codice, spostando la funzione 'prova', funzione che esegue il codice di inizializzazione dell'applicazione di cui ne tiene traccia la windows con il textLabel e la progressBar, all'interno della classe costruttrice della window ( class Ui(QWidget) ...).

from ReTaBo.gestioneFiles import wLog, firstCheck, strClockDate, checkUfficio
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic

class Ui(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi("..\\ReTaBo\\grafica\\introForm_ui.ui", self)

    def prova(self, temp):
        print("PROVA PROVA PROVA")
        info = firstCheck.go(self)  # crea le cartelle e sottocartelle
        dirMain = info[0]
        temp += info[1]
        del info

        # ------------------------------------------------------------
        log = open(dirMain + 'docs\\logs\\fileLog_' + strClockDate.goF() + '.txt', 'a')
        log.write('< ReTaBo >    file di log del: ' + strClockDate.goT())
        # ------------------------------------------------------------
        log.write(temp)  # mando la stringa temp al log
        del temp  # poi la cancello

        # legge i dati dell'Ufficio
        checkUfficio.go(dirMain)

        # ====================================
        # ESEGUIRE IN CHIUSURA DI APPLICAZIONE
        log.write(wLog.w('log chiuso!!!'))
        log.close()

if __name__ == '__main__':
    temp = wLog.w('###################### INIZIO MAIN retabo.py ######################')
    stepForPBar = 100//5 # settaggio degli step previsti per la progressBar

    appIntro = QApplication([])  # oggetto grafico application
    windowsIntro = Ui()  # creo oggetto grafico dalla classe Ui

    windowsIntro.show()  # lo rendo visibile
    #windowsIntro.prova(temp)
    if not windowsIntro.windowState(): windowsIntro.prova(temp)
    appIntro.exec()  # avvio l'oggetto application


Il tutto sembra funzionare.... non sono sicuro su questa parte di codice:

    windowsIntro.show()  # lo rendo visibile
    #windowsIntro.prova(temp)
    if not windowsIntro.windowState(): windowsIntro.prova(temp)
    appIntro.exec()  # avvio l'oggetto application

Cioè, vorrei che la funzione prova venisse richiamata quando la window è completamente 'disegnata' a schermo, ma poiché tutto avviene velocemente non so se è giusto richiamarla semplicemente con
windowsIntro.prova(temp)
oppure aspettare un evento della window che mi conferma il 'completamento' della window a schermo, ho cercato nelle referenze di QtWidget ma non sono riuscito a trovare l'evento, per cui ho provato con 'windowState'.