Python 3 и ограничение ручного ввода частоты FM-радиостанции от пользователя - PullRequest
0 голосов
/ 01 сентября 2018

Я учу себя Python и PYQT5, создавая FM-радио с использованием Raspberry Pi и Arduino. Pi запускает пользовательский интерфейс на 7-дюймовом сенсорном экране, а Arduino запускает оборудование FM-радио RDA5807M.

Одна из операций с радио, которую я хочу, - чтобы пользователь вручную вводил частоту станции, на которую должна настроиться радиостанция. Я хочу разрешить только действительные частоты для FM-станций в США (иначе, 88,3, 92,7, 104,5 и т. Д., В диапазоне от 88,1 до 107,9. Последняя цифра должна быть 1, 3, 5, 7 или 9. Если пользователь введите ключ, который не является цифрой или десятичной точкой. Я хочу, чтобы ключ игнорировался.

Похоже, это предполагает конечный автомат или операцию типа регулярного выражения, но я понятия не имею, как реализовать это с помощью Python (языковой барьер сейчас довольно крутой). Если бы у вас было подобное требование для пользовательского ввода, как бы вы это реализовали? Или указатель на дальнейшее чтение также приветствуется.

Спасибо.

1 Ответ

0 голосов
/ 02 сентября 2018

Попробуйте:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...