Python 3和限制来自用户的手动FM广播电台频率输入

时间:2018-09-01 18:18:30

标签: python pyqt pyqt5

我正在通过使用Raspberry Pi和Arduino构建FM收音机来自学Python和PYQT5。 Pi在7英寸的触摸屏上运行UI,而Arduino运行FM收音机RDA5807M硬件。

我要进行的无线电操作之一是让用户手动输入无线电应调谐到的电台的频率。我只想允许美国FM电台的有效频率(aka,即88.3、92.7、104.5等,范围为88.1至107.9。最后一位数字必须为1、3、5、7或9。如果用户键入不是数字或小数点的键,我希望该键被忽略。

这似乎暗示了一种状态机或正则表达式类型的操作,但是我不知道如何使用Python来实现此操作(现在的语言环境有点陡峭)。如果您对用户输入有类似的要求,您将如何实现?或者,也希望进一步阅读的指针。

谢谢。

1 个答案:

答案 0 :(得分:0)

尝试一下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui     import *
from PyQt5.QtCore    import *

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.frequencyStr = ""

        self.sb = QDoubleSpinBox()
        self.sb.setRange(88.1, 107.9)
        self.sb.setValue(88.3)   
        self.sb.setDecimals(1)
        self.sb.setSingleStep(0.2)        
        self.sb.valueChanged.connect(self.onValueChanged)

        self.labelSelected = QLabel("Selected station frequency: <b style='color: blue;'> 88.3 </b>")
        self.btn = QPushButton('Set up a radio station')
        self.btn.clicked.connect(self.setUpRadios)
        self.labelSet = QLabel()
        self.labelSet.setAlignment(Qt.AlignCenter)
        self.labelSet.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.labelSet.setScaledContents(True)

        layout = QVBoxLayout()
        layout.addWidget(self.labelSelected)
        layout.addWidget(self.btn)
        layout.addWidget(self.sb)
        layout.addWidget(self.labelSet)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def onValueChanged(self, value):
        if "{0:08b}".format(int("{:.1f}".format(value)[-1]))[-1] == "1":
            self.frequencyStr = "{:.1f}".format(value)
            self.labelSelected.setText(
                    "Selected station frequency: <b style='color: blue;'> {} </b>"
                    "".format(self.frequencyStr))
        self.labelSet.setText("")

    def setUpRadios(self, value):
        self.labelSet.setText("<b style='color: red; font:36pt \"Georgia\";'> {} </b>"
                              "".format(self.frequencyStr))

if __name__ == '__main__':
    app = QApplication([])
    MainWin = MainWindow()
    MainWin.show()
    app.exec()

enter image description here