使用 pyqt5 制作 GUI(来自我的传感器的数据)

Making a GUI using pyqt5 (data from my sensor)

我这周才开始试用 python,我急需一些帮助(请不要评判我,请善待嘿嘿)我有一个传感器(X4M300 存在传感器),我需要显示数据使用 python 在 GUI 中从中获取。我已经安装了pyqt5和qt designer。

首先,我有一个 python 脚本,我可以在其中打印出传感器的信息,如版本、固件 ID、序列号等。此处:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" \example X4M200_X4M300_printout_infromation.py

#Target module: X4M200,X4M300

#Introduction: This is an example of how to use the XEP interface from python to get module infromation.

#Command to run: "python X4M200_X4M300_printout_infromation.py -d com8" or "python3 X4M200_X4M300_printout_infromation.py -d com8"
                 Using TCP server address as device name is also supported, e.g. 
                 "python X4M200_sleep_record.py -d tcp://192.168.1.169:3000".


"""
from __future__ import print_function

import pymoduleconnector
from pymoduleconnector import ModuleConnector
from pymoduleconnector.ids import *
from optparse import OptionParser
import sys
import time


def try_xep(device_name):

    log_level = 0
    mc = ModuleConnector(device_name, log_level)
    x4m300 = mc.get_x4m300()

    # we have to go to manual mode
    x4m300.set_sensor_mode(XTS_SM_STOP, 0)
    x4m300.set_sensor_mode(XTS_SM_MANUAL, 0);

    xep = mc.get_xep()
    pong = xep.ping()
    print("Received pong:", hex(pong))

    print('ItemNumber =', xep.get_system_info(XTID_SSIC_ITEMNUMBER));
    print('OrderCode =', xep.get_system_info(XTID_SSIC_ORDERCODE));
    print('FirmWareID =', xep.get_system_info(XTID_SSIC_FIRMWAREID));
    print('Version =', xep.get_system_info(XTID_SSIC_VERSION));
    print('Build =', xep.get_system_info(XTID_SSIC_BUILD));
    print('SerialNumber =', xep.get_system_info(XTID_SSIC_SERIALNUMBER));
    print('VersionList =', xep.get_system_info(XTID_SSIC_VERSIONLIST));

    # inti x4driver
    xep.x4driver_init()

    # Set enable pin
    xep.x4driver_set_enable(1);

    # Set iterations
    xep.x4driver_set_iterations(16);
    # Set pulses per step
    xep.x4driver_set_pulses_per_step(256);
    # Set dac min
    xep.x4driver_set_dac_min(949);
    # Set dac max
    xep.x4driver_set_dac_max(1100);
    # Set TX power
    xep.x4driver_set_tx_power(2);

    # Enable downconversion
    xep.x4driver_set_downconversion(1);

    # Set frame area offset
    xep.x4driver_set_frame_area_offset(0.18)
    offset = xep.x4driver_get_frame_area_offset()
    print('x4driver_get_frame_area_offset returned: ', offset)


    # Set frame area
    xep.x4driver_set_frame_area(2,6)
    frame_area = xep.x4driver_get_frame_area()
    print('x4driver_get_frame_area returned: [', frame_area.start, ', ', frame_area.end, ']');

    # Set TX center freq
    xep.x4driver_set_tx_center_frequency(3);

    # Set PRFdiv
    xep.x4driver_set_prf_div(16)
    prf_div = xep.x4driver_get_prf_div()
    print('x4driver_get_prf_div returned: ', prf_div)


    # Start streaming
    xep.x4driver_set_fps(20)
    fps = xep.x4driver_get_fps()
    print('xep_x4driver_get_fps returned: ' ,fps)

    # Wait 5 sec.
    time.sleep(5)

    # Stop streaming
    xep.x4driver_set_fps(0);

    # Read data float if available.
    if xep.peek_message_data_float() > 0:
        data_float = xep.read_message_data_float()
    else:
        print('No data float messages available.')

    # Reset module
    xep.module_reset()


def main():
    parser = OptionParser()
    parser.add_option(
        "-d",
        "--device",
        dest="device_name",
        help="device file to use",
        metavar="FILE")

    (options, args) = parser.parse_args()

    if not options.device_name:
        print("you have to specify device, e.g.: python %s -d /dev/ttyACM0" % sys.argv[0])
        sys.exit(1)

    try_xep(options.device_name)

if __name__ == "__main__":
    main()

在 Qt Designer 中,我希望 GUI 看起来像这样:

在 Qt Designer 中创建的示例 GUI

到目前为止,这是我的 GUI 代码:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import uic

Ui_MainWindow, QtBaseClass = uic.loadUiType("x4m300gui1.ui")

class MyApp(QMainWindow):
    def __init__(self):
        super(MyApp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.connect_button.clicked.connect(self.ConnectModule)

    def ConnectModule(self):
        itemnumber_string = "" 
        ordercode_string = ""
        firmwareid_string = ""
        version_string = ""
        serialnumber_string = ""

        self.ui.itemnumber_box.setText(itemnumber_string)
        self.ui.ordercode_box.setText(ordercode_string)
        self.ui.firmwareid_box.setText(firmwareid_string)
        self.ui.version_box.setText(version_string)
        self.ui.serialnumber_box.setText(serialnumber_string)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

我想知道如何在单击按钮后在 gui 中显示传感器信息 'connect_button'。我会感谢所有的帮助。非常感谢。

您似乎想从 ConnectModule 调用 try_xep 过程。有try_xepreturn你要的信息,然后写进ui.

看起来您正在尝试 运行 传感器采样和 GUI 作为两个应用程序,它们需要命名管道或共享文件来访问彼此的内存。为简单起见,您应该 运行 将其作为单个应用程序。

我会采用 classic OOP 方法并制作一个 class 代表传感器

class X4M300():
    def __init__(self, options):
        # Initialise things required to sample sensor including the device options
        # Also get the device information and store it in local variables
        # Create a local variable that stores the sensor value
    def get_sample():
        # sequence of things required to trigger sensor to start sampling, get sample and save the value into the local variable, essentially the try_xep() method.

然后在 PyQt 应用程序的主要方法中创建一个传感器实例 class 并将选项作为参数传递。

sensor = X4M300(options)

然后你可以这样做:

def ConnectModule(self):
    sensor.get_sample()

    self.ui.itemnumber_box.setText(sensor.itemnumber)
    self.ui.ordercode_box.setText(sensor.ordercode)
    self.ui.firmwareid_box.setText(sensor.firmwareid)
    self.ui.version_box.setText(sensor.version)
    self.ui.serialnumber_box.setText(sensor.serialnumber)