171 lines
5.3 KiB
Python
171 lines
5.3 KiB
Python
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
|
||
from PyQt5.QtGui import QPixmap
|
||
from PyQt5.QtCore import Qt
|
||
from PyQt5.QtCore import QTimer, QCoreApplication
|
||
import sys
|
||
import os
|
||
|
||
from robowaiter.utils.ui.window import Ui_MainWindow
|
||
from robowaiter.utils.basic import get_root_path
|
||
from PyQt5.QtCore import QThread
|
||
import queue
|
||
import numpy as np
|
||
from PyQt5.QtGui import QImage, QPixmap
|
||
from PyQt5.QtCore import Qt
|
||
|
||
# 创建线程安全的队列
|
||
scene_queue = queue.Queue()
|
||
ui_queue = queue.Queue()
|
||
|
||
root_path = get_root_path()
|
||
|
||
class TaskThread(QThread):
|
||
def __init__(self, task, scene_cls,robot_cls, *args, **kwargs):
|
||
super(TaskThread, self).__init__(*args, **kwargs)
|
||
self.task = task
|
||
self.scene_cls = scene_cls
|
||
self.robot_cls = robot_cls
|
||
|
||
def run(self):
|
||
self.task(self.scene_cls,self.robot_cls)
|
||
|
||
def run_scene(scene_cls,robot_cls):
|
||
scene = scene_cls(robot_cls(),scene_queue,ui_queue)
|
||
|
||
scene.reset()
|
||
scene.run()
|
||
#
|
||
# try:
|
||
# # 机器人系统的主循环
|
||
#
|
||
# except Exception as e:
|
||
# # 打印异常信息到命令行
|
||
# print("Robot system error:", str(e))
|
||
|
||
|
||
|
||
class UI(QMainWindow, Ui_MainWindow):
|
||
scene = None
|
||
|
||
def __init__(self,scene_cls,robot_cls):
|
||
app = QApplication(sys.argv)
|
||
MainWindow = QMainWindow()
|
||
super(UI, self).__init__(MainWindow)
|
||
self.scene_cls = scene_cls
|
||
self.robot_cls = robot_cls
|
||
|
||
self.setupUi(MainWindow) # 初始化UI
|
||
|
||
# 初始化
|
||
self.btn_say.clicked.connect(self.btn_say_on_click)
|
||
|
||
# 设置一个定时器,每隔100ms检查一次队列
|
||
timer = QTimer()
|
||
timer.setInterval(100) # 设置检查队列的间隔时间
|
||
timer.timeout.connect(self.handle_queue_messages) # 当定时器超时时,处理队列中的消息
|
||
timer.start() # 启动定时器
|
||
|
||
MainWindow.show()
|
||
|
||
thread = TaskThread(run_scene,scene_cls,robot_cls)
|
||
thread.start()
|
||
|
||
sys.exit(app.exec_())
|
||
|
||
def btn_say_on_click(self):
|
||
question = self.edit_say.text()
|
||
if question[-1] == ")":
|
||
print(f"设置目标:{question}")
|
||
self.scene_func(("new_set_goal",question))
|
||
# self.scene.new_set_goal(question)
|
||
else:
|
||
self.scene_func(("customer_say","System",question))
|
||
# self.scene.customer_say("System", question)
|
||
|
||
def scene_func(self,args):
|
||
scene_queue.put(args)
|
||
|
||
def handle_queue_messages(self):
|
||
while not ui_queue.empty():
|
||
message = ui_queue.get()
|
||
function_name = message[0]
|
||
function = getattr(self, function_name, None)
|
||
|
||
args = []
|
||
if len(message)>1:
|
||
args = message[1:]
|
||
|
||
result = function(*args)
|
||
|
||
def setupUi(self, MainWindow):
|
||
Ui_MainWindow.setupUi(self,MainWindow)
|
||
|
||
# dir_path = os.path.dirname(__file__)
|
||
|
||
# 加载并显示图片
|
||
# img_path = os.path.join(root_path, "robowaiter/utils/draw_bt/test.png")
|
||
# self.draw_from_file("img_label_bt",img_path)
|
||
# self.label.setAlignment(Qt.AlignCenter) # 图片居中显示
|
||
|
||
def draw_from_file(self,control_name,file_name):
|
||
control = getattr(self,control_name,None)
|
||
# 加载并显示图片
|
||
pixmap = QPixmap(file_name) # 替换为你的图片路径
|
||
# self.label.setPixmap(pixmap)
|
||
control.setPixmap(self.scale_pixmap_to_label(pixmap, control))
|
||
|
||
def draw_img(self,control_name,img):
|
||
control = getattr(self,control_name,None)
|
||
# 加载并显示图片
|
||
print(img)
|
||
img = self.ndarray_to_qimage(img)
|
||
print(img)
|
||
pixmap = QPixmap.fromImage(img) # 替换为你的图片路径
|
||
# self.label.setPixmap(pixmap)
|
||
control.setPixmap(self.scale_pixmap_to_label(pixmap, control))
|
||
|
||
def draw_canvas(self,control_name,canvas):
|
||
control = getattr(self,control_name,None)
|
||
# 加载并显示图片
|
||
|
||
pixmap = QApplication.grabWidget(canvas)
|
||
|
||
# self.label.setPixmap(pixmap)
|
||
control.setPixmap(self.scale_pixmap_to_label(pixmap, control))
|
||
|
||
|
||
def ndarray_to_qimage(self,array: np.ndarray) -> QImage:
|
||
# 假设你的ndarray是uint8类型的,且是RGB格式(三个通道)
|
||
height, width, channels = array.shape
|
||
if channels ==3:
|
||
bytes_per_line = channels * width
|
||
image = QImage(array.data, width, height, bytes_per_line, QImage.Format_RGB888)
|
||
else:
|
||
# 对于灰度图像
|
||
image = QImage(array.data, width, height, QImage.Format_Grayscale8)
|
||
|
||
return image
|
||
|
||
def scale_pixmap_to_label(self, pixmap, label):
|
||
# 获取QLabel的大小
|
||
label_width = label.width()
|
||
label_height = label.height()
|
||
|
||
# 保持图片的长宽比,同时确保图片的一个维度适应QLabel的大小
|
||
scaled_pixmap = pixmap.scaledToWidth(label_width, Qt.SmoothTransformation)
|
||
if scaled_pixmap.height() > label_height:
|
||
scaled_pixmap = pixmap.scaledToHeight(label_height, Qt.SmoothTransformation)
|
||
|
||
return scaled_pixmap
|
||
|
||
def set_scene(self, scene):
|
||
self.scene = scene
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# app = QApplication(sys.argv)
|
||
# MainWindow = QMainWindow()
|
||
ui = UI()
|
||
# ui.setupUi(MainWindow)
|
||
# MainWindow.show()
|
||
# sys.exit(app.exec_()) |