Topic: Qtimer, come usarlo nella GUI?  (Letto 1222 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline n3c0

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Qtimer, come usarlo nella GUI?
« il: Marzo 29, 2017, 14:35 »
Salve a tutti,
avendo tempo libero ed avendo l'esigenza di svilupparmi un piccolo programmino ho deciso, da profano della programmazione, di cominciare ad imparare un linguaggio di programmazione. Ho scelto Python perché leggendo in giro ho appreso che è "semplice", molto utilizzato e pertanto con una ricca community che può correre in soccorso in caso di aiuto...ed infatti non c'è voluto molto affinché dovessi ricorrere all'aiuto degli esperti.

Il problema principale che ho dovuto affrontare è stata la GUI, ho iniziato con Tkinter, ma ho scoperto prestissimo a mie spese che è molto "macchinoso", pertanto leggendo guide e tutorial ho deciso di passare all'accoppiata QT - Pyqt. Devo dire che realizzare la GUI in grafica e mettere mano sul codice generato è sicuramente più semplice!

Veniamo al sodo ho creato una finestra con due label ed un bottone. Il bottone incrementa un contatore che viene mostrato in una label, mentre l'altra label mostra un'immagine. Ok e dov'è il problema?
Il problema sta nel fatto che vorrei far mutare l'immagine ogni tot secondi.
Ho provato tantissime soluzioni, che prese singolarmente funzionano tutte, ma come le applico alla GUI mi creano problemi ed errori. Il problema è certamente la mia poca conoscenza ed esperienza in materia....
Ho letto da qualche parte che potrei utilizzare Qtimer, l'ho installato ed ho letto le reference, ma onestamente non ci ho capito molto....

Qualche anima pia vuol dare un'occhiata al mio codice e dirmi dove sbaglio? Grazie mille

P.S. nel codice non ho implementato ancora Qtimer, mi sono fermato alla soluzione con i threading...



# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:UsersennetDesktoptest pythonEliminacodauiEliminacoda.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import time, threading, os, random

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(452, 448)
        Form.setAutoFillBackground(False)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_2 = QtWidgets.QLabel(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
        self.label_2.setSizePolicy(sizePolicy)
        self.label_2.setText("")
        self.label_2.setPixmap(QtGui.QPixmap(foto))
        self.label_2.setScaledContents(True)
        self.label_2.setObjectName("label_2")
        self.verticalLayout.addWidget(self.label_2)
        self.label = QtWidgets.QLabel(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        self.label.setText("")
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setText("PushButton")
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)

        self.retranslateUi(Form)
        self.pushButton.clicked.connect(self.on_PB)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))

    def on_PB(self, Form):
        global contatore
        if contatore < 99:
            contatore += 1
        else:
            contatore = 1
           
        self.label.setText(str(contatore))
        print (contatore)

    def random_foto(self, Form):
        self.label_2.setPixmap(QtGui.QPixmap(foto))
        print("pronto?!")
        threading.Timer(4, random_foto).start()

   


foto = str('C:\foto\'+random.choice(os.listdir('C:\foto')))
self.label_2.setPixmap(QtGui.QPixmap(foto))
print(foto)
threading.Timer(4, print(foto)).start()
contatore=0


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
   

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Qtimer, come usarlo nella GUI?
« Risposta #1 il: Marzo 29, 2017, 16:43 »
> ho iniziato con Tkinter, ma ho scoperto prestissimo a mie spese che è molto "macchinoso"
uh? è senz'altro meno macchinoso delle Qt...

>  Devo dire che realizzare la GUI in grafica...
Ah, con "macchinoso" intendi dire che bisogna scrivere del codice... è vero ma purtroppo anche con le Qt a un certo punto...

>  mettere mano sul codice generato è sicuramente più semplice
... a un certo punto bisogna mettere mano al codice, e che sia "più semplice" è discutibile, dipende da quello che devi fare.
Il punto di partenza comunque sarebbe conoscere i principi della programmazione, e in particolare della programmazione a oggetti. Senza capire come funziona una classe, mi sa che le Qt saranno un po'... "macchinose", ecco.

> Ho provato tantissime soluzioni
Qui "tantissime" sembra un po' un'esagerazione. Se devi temporizzare, oltre che un timer che altro vuoi usare?
Ed è vero, effettivamente le Qt (come altri gui framework) hanno una classe interna per creare e operare un timer (QTimer, quindi), che funziona grosso modo come threading.Timer in effetti.
Usare QTimer o usare threading.Timer? Non conosco abbastanza le Qt da saperlo, ma andrei su QTimer per sicurezza. Almeno sai che è una classe progettata per funzionare bene con le Qt. Visto che comunque si tratta di usare i thread e che i thread sono sempre problematici, meglio non correre rischi.

Detto questo, anche il tuo esempio con threading.Timer dovrebbe funzionare benone. L'unica cosa che lo trattiene dal funzionare è l'assurdità delle righe 71-75 completamente fuori da ogni classe, che non vengono mai effettivamente usate una volta che il mainloop delle Qt è avviato (è per questo che ti chiedevo se conosci come si usano le classi). Se il tuo metodo "random_foto" facesse quello che fanno le righe 71-75, saresti a posto. Ovviamente dovresti chiamare "random_foto" una prima volta "da fuori" per inizializzare il ciclo. Potresti chiamarlo in risposta alla pressione di un pulsante, o semplicemente nell'__init__ della classe.

A parte questo, non dovrebbero esserci problemi, almeno così a prima vista. Ma le Qt non sono il mio framework d'elezione, quindi non ci metto la mano sul fuoco.

Offline n3c0

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Qtimer, come usarlo nella GUI?
« Risposta #2 il: Marzo 29, 2017, 18:32 »
Beh si lo ammetto, sulle classi non mi sono applicato molto e non le ho capite bene....ovviamente sto apprendendo e sicuramente sarà oggetto dei miei prossimi studi.

Per quanto riguarda le righe che hai indicato, ad eccezione della 75 che mi serve per dare un punto di partenza al contatore, le altre sono residui di prove che ho fatto e sono rimasti li appesi...

tornando al codice ho avuto problemi proprio a chiamare da "fuori" il metodo....ad un certo punto mi craschava proprio python senza restituire errori, forse mi conviene studiare bene il QTimer e provare con uno strumento della stessa "famiglia".
Prima ancora è meglio approfondire le classi...altrimenti non capirò mai nulla appieno...hai consigli da darmi in merito?
Grazie

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Qtimer, come usarlo nella GUI?
« Risposta #3 il: Marzo 30, 2017, 08:16 »
scegliti un buon libro, un tutorial (a partire da quello ufficiale)... cerca sul forum. Non è che uno debba andare proprio sul tecnico, ma insomma, sapere cos'è l'init di una classe, che cosa sono attributi di istanza e attributi di classe, quelle cose lì.

Offline n3c0

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Qtimer, come usarlo nella GUI?
« Risposta #4 il: Marzo 30, 2017, 15:03 »
Grazie per la diritta!!!
in effetti ho risolto facendo partire il qtimer nell' __init__ ed è andato tutto alla perfezione. Ho letto qualcosa in giro e ci so arrivato, ma le classi comunque restano un po' misteriose per me. Devo assolutamente approfondire. Ho capito cosa sono e come funzionano, ma c'è qualcosina che proprio non mi quadra....comunque va bene così con l'esperienza e lo studio riuscirò a padroneggiarle per bene! :-D

Grazie ancora.

Offline Missile

  • python neanderthalensis
  • ****
  • Post: 306
  • Punti reputazione: 0
    • Mostra profilo
Re:Qtimer, come usarlo nella GUI?
« Risposta #5 il: Maggio 20, 2017, 15:33 »
ciao , non ho letto tutto.. ma di do un consiglio.. come faccio io.. se non trovi codice su google cerca in gist github  e trovi tutto codice esempi. esempio:
https://gist.github.com/saleph/00366292be345d1ba3e7
e vedi se fa caso tuo.

saluti e buona fine settimana.