TimeDelta aktion auserhalb der Gui ausführen ?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AlbanimusIX
User
Beiträge: 5
Registriert: Donnerstag 25. April 2019, 16:09

Hi,

ich versuche mich gerade in meinem Praktikum daran aus einer Maschine Signale abzufangen und auszuwerten mittels Raspberry Pi. Fur die Oberflaeche nutze ich Qt-Designer. Eig funktioniert alles, doch ich habe das gefühl das es sicherlich eine Elegantere loesung gibt. Da auch die auslasung bei ca.35% liegt denke ich liegt es an meinem unreifen programmier style. Die GUI hat ca. 8Widgets.

Im Prinzip ist mein Programm wie im hier dargestellten mini Programm mit einem timeEdit Widget dargestellt :

Code: Alles auswählen

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import QLCDNumber, QDialog, QPushButton, QVBoxLayout, QApplication, QTimer

cycle_time = 0


class Ui_Form(QDialog):

    def __init__(self):
        super(Ui_Form, self).__init__()
        self.timeEdit = QtWidgets.QTimeEdit(Form)
        self.timer = QTimer()
        self.timer.timeout.connect(self.Time)
        self.Time()



    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.timeEdit.setGeometry(QtCore.QRect(70, 110, 271, 71))
        self.timeEdit.setMaximumTime(QtCore.QTime(12, 59, 59))
        self.timeEdit.setMinimumTime(QtCore.QTime(0, 0, 0))
        self.timeEdit.setCurrentSection(QtWidgets.QDateTimeEdit.SecondSection)
        self.timeEdit.setCalendarPopup(False)
        self.timeEdit.setObjectName("timeEdit")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

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

    def Time(self):
        global cycle_time
        cycle_time = self.timeEdit.time()
        print(cycle_time)
        self.timer.start(1000)


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_()) 
Meine Frage lautet : Ist es moeglich die def Time() auserhalb der Ui_Form() zu initialisieren sodass beim veraendern der zeit per time.Edit sie korrrekt geprintet ?
ps : ich bin Machienbauer und befasse mich mit Python seit ca.2-3 Wochen falls mein beispiel Code grobe Fehler enthaelt bitte nachsicht aber was ich nicht denke da es ja funktioniert haha :roll:
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AlbanimusIX: Der erste Fehler ist es in der generierten `Ui_*.py`-Datei Änderungen vorzunehmen. Da sollte ja auch ein Kommentar am Anfang gewesen sein, der genau das aussagt.

Man generiert eigentlich gar keinen Quelltext mehr sondern verwendet das `PyQt5.uic`-Modul um die `*.ui`-Datei zur Laufzeit zu laden.

Dann ist das globale `cycle_time` falsch. ``global`` ist an sich schon immer falsch wenn es ein Anfänger verwendet. Wenn man sowieso objektorientiert programmiert, also Klassen schreibt, dann gibt es echt gar keine Ausrede mehr für ``global``. Vergiss, dass es dieses Schlüsselwort gibt.

An dem `setupUi()`-Code sieht man, dass Du anscheinend die Fenstergrösse manuell fest vorgegeben hast und das `QTimeEdit` darin an absolute Pixelkoordinaten mit absolter Grösse in Pixeln platziert hast. Nimm Layouts, damit das nicht nur bei Deinem Rechner, und solchen mit ähnlichen Einstellungen funktioniert. Displaygrössen und -auflösungen sind heute so unterschiedlich, dass man keine Pixelangaben mehr verwenden kann/sollte.

Die Frage verstehe ich nicht. Was willst Du da wie von ausserhalb initialisieren?

`Time` und `Form` verstossen übrigens sowohl gegen die Python-Namenskovnentionen als auch gegen die von Qt. In beiden müssten das Klassen sein und keine Werte oder Methoden. Die schreibt man in Python klein_mit_unterstrichen und in Qt inCamelCase.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
AlbanimusIX
User
Beiträge: 5
Registriert: Donnerstag 25. April 2019, 16:09

@__blackjack__

Vielen Dank fuer deine Antwort.
Anscheinend habe ich noch sehr viel zu verbessern. Das mit der frage kann warten ich werde zunaechst die beschriebenen Fehler verbessern.
AlbanimusIX
User
Beiträge: 5
Registriert: Donnerstag 25. April 2019, 16:09

@__blackjack__ : wie kann ich "global" umgehen ? wie bekomme ich zugriff auf die cycle_time variable von der time methode ohne das global ?
danke im vorraus
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie greifst Du denn auf `timeEdit` zu?

Was willst Du eigentlich erreichen? So ganz klar wird mir das aus Deiner Erklärung nicht.
AlbanimusIX
User
Beiträge: 5
Registriert: Donnerstag 25. April 2019, 16:09

@Sirius3 : Ich moechte erreichen, dass wenn ich ueber die GUI das EditTime Widget auf z.b. 05:00 stelle es mir dies in der cycle_time variable speichert.
das funktioniert auch aber ich moechte dem global entgehen.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Du aber nichts mit `cycle_time` machst, kannst Du das auch sein lassen. Null Effekt.

Daher meine Frage, was willst Du eigentlich machen?
AlbanimusIX
User
Beiträge: 5
Registriert: Donnerstag 25. April 2019, 16:09

in dem oben gezeigen beispiel moechte ich damit nichts machen, da dies nur ein beispiel ist um zu zeigen wie ich"programmiert" habe.
im eingentlichen Programm soll cycle_time von einer klasse aufgegriffen werden und weiter verrechnet werden. So die vorstellung aber so weit bin ich noch nicht wuerde gern die oben gelisteten fehler erstmal begradigen.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke es wäre trotzdem eine gute Idee mal deine gesamte Aufgabe zu Posten. Denn oft macht man als Anfänger den Fehler einen falschen Ansatz zu wählen & sich daran fest zu beißen.
Antworten