モノ創りで国造りを

ハード/ソフト問わず知見をまとめてます

pyqt5でGUIアプリ開発

背景

ROS搭載ロボット用に開発した基板のデバッグ用アプリをVisual Studio 2019を使用していたが、 ROS開発環境があるならpyqt5で開発した方が便利・楽であると考えたので簡易なアプリを開発してみた。 備忘録として記録を残す。

開発したもの

開発したアプリは非常に単純なもので、入力欄とボタンがあり、ボタンを押下すると対応した入力欄の数値を既定のtopicにpublishするものである。 成果物は以下。

f:id:yuji2yuji:20220316164635p:plain

スクリプト

スクリプトは以下。

#!/usr/bin/python

import rospy
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QLabel, QLineEdit
from std_msgs.msg import String
from std_msgs.msg import UInt16
from std_msgs.msg import Int16MultiArray

pub_string = rospy.Publisher('topic_string', String, queue_size = 1)
pub_int = rospy.Publisher('topic_int', UInt16, queue_size = 1)
pub_array = rospy.Publisher('topic_array', Int16MultiArray, queue_size = 1)

def on_string_btn_clicked():
    pub_string.publish(string_input.text())
    
def on_int_btn_clicked():
    pub_int.publish(int(int_input.text()))

def on_array_btn_clicked():
    array = [int(array_input1.text()), int(array_input2.text())]
    data_array = Int16MultiArray(data = array)
    pub_array.publish(data_array)

if __name__ == '__main__':
    app = QApplication([])
    window = QWidget()
    window.setWindowTitle('QGridLayout')
    
    label_string = QLabel('Enter String')
    string_input = QLineEdit('')
    btn_string = QPushButton('Publish String')
    btn_string.clicked.connect(on_string_btn_clicked)
    
    label_int = QLabel('Enter Int')
    int_input = QLineEdit('')
    btn_int = QPushButton('Publish Int')
    btn_int.clicked.connect(on_int_btn_clicked)
    label_array1 = QLabel('Array1')
    array_input1 = QLineEdit('')
    label_array2 = QLabel('Array2')
    array_input2 = QLineEdit('')
    btn_array = QPushButton('Send Array')
    btn_array.clicked.connect(on_array_btn_clicked)
    
    layout = QGridLayout()
    
    layout.addWidget(label_string, 0, 0)
    layout.addWidget(string_input, 0, 1)
    layout.addWidget(btn_string, 0, 2)
    layout.addWidget(label_int, 1, 0)
    layout.addWidget(int_input, 1, 1)
    layout.addWidget(btn_int, 1, 2)
    layout.addWidget(label_array1, 2, 0)
    layout.addWidget(array_input1, 2, 1)
    layout.addWidget(label_array2, 3, 0)
    layout.addWidget(array_input2, 3, 1)
    layout.addWidget(btn_array, 2, 2, 2, 2)

    window.setLayout(layout)
    window.show()

    rospy.init_node('pub_test', anonymous=True)

    app.exec_()

成果物

成果物を再掲。

f:id:yuji2yuji:20220316164626p:plain