😺
pyqt5でGUIアプリ開発
背景
ROS搭載ロボット用に開発した基板のデバッグ用アプリをVisual Studio 2019を使用していたが、
ROS開発環境があるならpyqt5で開発した方が便利・楽であると考えたので簡易なアプリを開発してみた。
備忘録として記録を残す。
*本記事ははてなブログにも投稿済み。パクリじゃないよ。
開発したもの
開発したアプリは非常に単純なもので、入力欄とボタンがあり、ボタンを押下すると対応した入力欄の数値を既定のtopicにpublishするものである。
成果物は以下。
スクリプト
スクリプトは以下。
#!/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_()
成果物
成果物を再掲。
Discussion