如何在不破坏循环的情况下从循环中获取价值

How to get value out of loop, without breaking the loop

我正在尝试制作一个视频播放器,它对视频播放器操作(播放、暂停、快进等)使用手势识别

对于视频播放器,我使用 PyQt5,对于手势识别,我使用 MediaPipe。 Here's what my program looks like

现在这是我用于 运行 相机并在 QMainWindow 中发射它的代码:

class Camera(QThread):
    image_update = pyqtSignal(QImage)
    video_capture = cv2.VideoCapture(0)
    action = ""

    def run(self):
        self.active_thread = True
        video_capture = cv2.VideoCapture(0)

        tracker = htm.HandTrackingModule()
        recognize = grm.GestureRecognitionModule() 

        while self.active_thread:
            ret, frame = video_capture.read()
            h, w, c = frame.shape
            if ret:
                image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                landmarks = tracker.detect_hand(image, True)
                fingers = get_position(landmarks)

                action = recognize.do_gesture(position=fingers, landmarks=landmarks, img=image)

                convert_to_qt_format = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)

            pic = convert_to_qt_format.scaled(640, 480, Qt.KeepAspectRatio)

            self.image_update.emit(pic)

GestureRecognitionModule的do_gesture方法,returns根据手势识别(暂停、播放、快进、倒回、音量up/down, ...)

我想在我的 QMainWindows 中获取 'action'(do_gesture() 的值),以便我可以将它与 VideoPlayer 连接。

但我不确定我该怎么做。

tldr:如何在不中断循环的情况下从循环中获取值?

你可能想要发出信号。

action 的信号添加到您的 Camera class,就在您的 image_update 信号旁边:

class Camera(QThread):
    image_update = pyqtSignal(QImage)
    gesture_action = pyqtSignal(str)

然后在你的循环中你可以做:

                action = recognize.do_gesture(position=fingers, landmarks=landmarks, img=image)
                self.gesture_action.emit(action)

这不会中断循环。

将该信号连接到一个插槽(大概在您的 MainWindow 或其子部件之一中),当存在 action.

时,该插槽可以执行您想要执行的任何操作