Countdown mit Ansage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tschorsch
User
Beiträge: 9
Registriert: Donnerstag 17. September 2020, 08:40

Vielen Dank!

Was ich eigentlich machel will ist folgendes (und bitte sagen, sollte dies zu kompliziert sein...): Ich habe im Qt Designer ein Gui gebastelt mit ein paar Buttons und Felder.

Wenn ich den Button "B_Start" drücke, soll der Countdown starten und die Ausgabe soll im Feld "label_4".

Ist das machbar oder bin ich total auf dem Holzweg?

Code: Alles auswählen

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 300)
        MainWindow.setMinimumSize(QtCore.QSize(500, 300))
        MainWindow.setMaximumSize(QtCore.QSize(500, 300))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 150, 431, 90))
        font = QtGui.QFont()
        font.setPointSize(7)
        self.layoutWidget.setFont(font)
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label_4 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1)
        self.Out_CountD = QtWidgets.QLineEdit(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.Out_CountD.setFont(font)
        self.Out_CountD.setReadOnly(True)
        self.Out_CountD.setObjectName("Out_CountD")
        self.gridLayout.addWidget(self.Out_CountD, 0, 1, 1, 1)
        self.label_8 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.gridLayout.addWidget(self.label_8, 0, 2, 1, 1)
        self.Out_Time_Total = QtWidgets.QLineEdit(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.Out_Time_Total.setFont(font)
        self.Out_Time_Total.setReadOnly(True)
        self.Out_Time_Total.setObjectName("Out_Time_Total")
        self.gridLayout.addWidget(self.Out_Time_Total, 0, 3, 1, 1)
        self.label_5 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.gridLayout.addWidget(self.label_5, 1, 0, 1, 1)
        self.Out_Count_A = QtWidgets.QLineEdit(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.Out_Count_A.setFont(font)
        self.Out_Count_A.setReadOnly(True)
        self.Out_Count_A.setObjectName("Out_Count_A")
        self.gridLayout.addWidget(self.Out_Count_A, 1, 1, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.gridLayout.addWidget(self.label_6, 2, 0, 1, 1)
        self.Out_Count_B = QtWidgets.QLineEdit(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.Out_Count_B.setFont(font)
        self.Out_Count_B.setReadOnly(True)
        self.Out_Count_B.setObjectName("Out_Count_B")
        self.gridLayout.addWidget(self.Out_Count_B, 2, 1, 1, 1)
        self.label_7 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.gridLayout.addWidget(self.label_7, 3, 0, 1, 1)
        self.Out_Count_L = QtWidgets.QLineEdit(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.Out_Count_L.setFont(font)
        self.Out_Count_L.setReadOnly(True)
        self.Out_Count_L.setObjectName("Out_Count_L")
        self.gridLayout.addWidget(self.Out_Count_L, 3, 1, 1, 1)
        self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QtCore.QRect(20, 10, 431, 21))
        font = QtGui.QFont()
        font.setPointSize(7)
        self.layoutWidget1.setFont(font)
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget1)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.HotSpotIP = QtWidgets.QLabel(self.layoutWidget1)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.HotSpotIP.setFont(font)
        self.HotSpotIP.setObjectName("HotSpotIP")
        self.horizontalLayout.addWidget(self.HotSpotIP)
        self.HotSpotIPInput = QtWidgets.QLineEdit(self.layoutWidget1)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.HotSpotIPInput.setFont(font)
        self.HotSpotIPInput.setReadOnly(True)
        self.HotSpotIPInput.setObjectName("HotSpotIPInput")
        self.horizontalLayout.addWidget(self.HotSpotIPInput)
        self.BaseAIP = QtWidgets.QLabel(self.layoutWidget1)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.BaseAIP.setFont(font)
        self.BaseAIP.setObjectName("BaseAIP")
        self.horizontalLayout.addWidget(self.BaseAIP)
        self.BaseAIPInput = QtWidgets.QLineEdit(self.layoutWidget1)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.BaseAIPInput.setFont(font)
        self.BaseAIPInput.setReadOnly(True)
        self.BaseAIPInput.setObjectName("BaseAIPInput")
        self.horizontalLayout.addWidget(self.BaseAIPInput)
        self.BaseBIP = QtWidgets.QLabel(self.layoutWidget1)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.BaseBIP.setFont(font)
        self.BaseBIP.setObjectName("BaseBIP")
        self.horizontalLayout.addWidget(self.BaseBIP)
        self.BaseBIPInput = QtWidgets.QLineEdit(self.layoutWidget1)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.BaseBIPInput.setFont(font)
        self.BaseBIPInput.setReadOnly(True)
        self.BaseBIPInput.setObjectName("BaseBIPInput")
        self.horizontalLayout.addWidget(self.BaseBIPInput)
        self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget2.setGeometry(QtCore.QRect(20, 60, 431, 19))
        font = QtGui.QFont()
        font.setPointSize(7)
        self.layoutWidget2.setFont(font)
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.B_Connect = QtWidgets.QPushButton(self.layoutWidget2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.B_Connect.sizePolicy().hasHeightForWidth())
        self.B_Connect.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.B_Connect.setFont(font)
        self.B_Connect.setObjectName("B_Connect")
        self.horizontalLayout_2.addWidget(self.B_Connect)
        self.B_Start = QtWidgets.QPushButton(self.layoutWidget2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.B_Start.sizePolicy().hasHeightForWidth())
        self.B_Start.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.B_Start.setFont(font)
        self.B_Start.setObjectName("B_Start")
        self.horizontalLayout_2.addWidget(self.B_Start)
        self.B_Reset = QtWidgets.QPushButton(self.layoutWidget2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.B_Reset.sizePolicy().hasHeightForWidth())
        self.B_Reset.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.B_Reset.setFont(font)
        self.B_Reset.setObjectName("B_Reset")
        self.horizontalLayout_2.addWidget(self.B_Reset)
        self.B_ListPilots = QtWidgets.QPushButton(self.layoutWidget2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.B_ListPilots.sizePolicy().hasHeightForWidth())
        self.B_ListPilots.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.B_ListPilots.setFont(font)
        self.B_ListPilots.setObjectName("B_ListPilots")
        self.horizontalLayout_2.addWidget(self.B_ListPilots)
        self.B_ListRounds = QtWidgets.QPushButton(self.layoutWidget2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.B_ListRounds.sizePolicy().hasHeightForWidth())
        self.B_ListRounds.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.B_ListRounds.setFont(font)
        self.B_ListRounds.setObjectName("B_ListRounds")
        self.horizontalLayout_2.addWidget(self.B_ListRounds)
        self.layoutWidget3 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget3.setGeometry(QtCore.QRect(20, 100, 431, 21))
        font = QtGui.QFont()
        font.setPointSize(7)
        self.layoutWidget3.setFont(font)
        self.layoutWidget3.setObjectName("layoutWidget3")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.layoutWidget3)
        self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.radioButton = QtWidgets.QRadioButton(self.layoutWidget3)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.radioButton.setFont(font)
        self.radioButton.setObjectName("radioButton")
        self.horizontalLayout_3.addWidget(self.radioButton)
        self.radioButton_2 = QtWidgets.QRadioButton(self.layoutWidget3)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.radioButton_2.setFont(font)
        self.radioButton_2.setObjectName("radioButton_2")
        self.horizontalLayout_3.addWidget(self.radioButton_2)
        self.radioButton_3 = QtWidgets.QRadioButton(self.layoutWidget3)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.radioButton_3.setFont(font)
        self.radioButton_3.setObjectName("radioButton_3")
        self.horizontalLayout_3.addWidget(self.radioButton_3)
        self.pushButton_5 = QtWidgets.QPushButton(self.layoutWidget3)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.pushButton_5.setFont(font)
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout_3.addWidget(self.pushButton_5)
        self.lineEdit_9 = QtWidgets.QLineEdit(self.layoutWidget3)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.lineEdit_9.setFont(font)
        self.lineEdit_9.setReadOnly(True)
        self.lineEdit_9.setObjectName("lineEdit_9")
        self.horizontalLayout_3.addWidget(self.lineEdit_9)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 18))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_4.setText(_translate("MainWindow", "Countdown:"))
        self.label_8.setText(_translate("MainWindow", "Race Time: "))
        self.label_5.setText(_translate("MainWindow", "Base A:"))
        self.label_6.setText(_translate("MainWindow", "Base B:"))
        self.label_7.setText(_translate("MainWindow", "Lap:"))
        self.HotSpotIP.setText(_translate("MainWindow", "Centre Box IP:"))
        self.BaseAIP.setText(_translate("MainWindow", "Base A IP:"))
        self.BaseBIP.setText(_translate("MainWindow", "Base B IP:"))
        self.B_Connect.setText(_translate("MainWindow", "Connect"))
        self.B_Start.setText(_translate("MainWindow", "Start"))
        self.B_Reset.setText(_translate("MainWindow", "Reset"))
        self.B_ListPilots.setText(_translate("MainWindow", "List Pilots"))
        self.B_ListRounds.setText(_translate("MainWindow", "List Rounds"))
        self.radioButton.setText(_translate("MainWindow", "Single"))
        self.radioButton_2.setText(_translate("MainWindow", "Continous"))
        self.radioButton_3.setText(_translate("MainWindow", "Beeper"))
        self.pushButton_5.setText(_translate("MainWindow", "Pilot"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
Vielen Dank!
Georg
Benutzeravatar
mp1337
User
Beiträge: 23
Registriert: Dienstag 5. Mai 2020, 16:33
Kontaktdaten:

Ich würde Dir raten die Datei als .ui zu speichern und in deiner PyQt5 Anwendung zu laden (Übersicht halber).

https://github.com/MP1337/PGEN_Simple_P ... master/src

Kannst in meiner Qt Anwendung schauen wie das funktioniert. Ich habe dort auch Textfeld welches ich befülle. lineStrongness.
IT-News ohne Werbung
https://www.it-feedo.de
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tschorsch: Das ist natürlich machbar, funktioniert aber komplett anders als ein Konsolenprogramm mit einer ``while``-Schleife und `time.sleep()`. Weil GUI-Programmierung anders funktioniert. Die ist ereignisbasiert. Das heisst man erstellt die GUI und verbindet Ereignisse mit Rückruffunktionen/-methoden die aufgerufen werden wenn das Ereignis eintritt. Ereignisse können das klicken auf Schaltflächen sein, aber auch das eine gewisse Zeit verstrichen ist — beispielsweise eine Sekunde. Wenn man alles soweit vorbereitet hat, ruft man die GUI-Hauptschleife auf und *die* steuert den weiteren Programmablauf und verträgt sich nicht mit lang laufenden Schleifen in Deinem Code. Die registrierten Rückrufe dürfen nur *kurz* etwas tun und dann die Kontrolle wieder an die GUI-Hauptschleife zurückgeben.

Wenn man bei Qt mit Theads arbeiten will, sollte man auch schauen ob es sinnvoll ist `QThread` statt dem `threading`-Modul zu verwenden. Dort kann man dann beispielsweise mit dem Signal/Slot-Prinzip von Qt statt mit eigenen Queues kommunizieren.

Das ``while``/`sleep()` kann man mit in Qt mit einem `QTimer` und einer Methode die *einen* Durchlauf der ``while``-Schleife darstellt, umsetzen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal ein einfacher Countdown in Qt ohne Sprachausgabe:

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import (
    QApplication,
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class Countdown:
    def __init__(self):
        self._counter_value = None

        self.ui = QWidget()
        self.ui.setWindowTitle("Countdown")
        layout = QVBoxLayout()

        self.countdown_label = QLabel(alignment=Qt.AlignCenter)
        font = self.countdown_label.font()
        font.setPointSize(font.pointSize() * 3)
        font.setBold(True)
        self.countdown_label.setFont(font)
        
        layout.addWidget(self.countdown_label)

        self.start_countdown_button = QPushButton(
            "Starte Countdown", clicked=self.start
        )
        layout.addWidget(self.start_countdown_button)

        self.ui.setLayout(layout)

        self.counter_value = 0
        self.timer = QTimer(timeout=self.step)

    @property
    def counter_value(self):
        return self._counter_value

    @counter_value.setter
    def counter_value(self, value):
        self._counter_value = value
        self.countdown_label.setText(str(self.counter_value))

    def start(self):
        self.start_countdown_button.setEnabled(False)
        self.counter_value = 30
        self.timer.start(1000)

    def step(self):
        if self.counter_value > 0:
            self.counter_value -= 1
        else:
            self.timer.stop()
            self.start_countdown_button.setEnabled(True)


def main():
    app = QApplication(sys.argv)
    countdown = Countdown()
    countdown.ui.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten