Код Python работает только во время отладки, а не во время работы. ⇐ Python
-
Anonymous
Код Python работает только во время отладки, а не во время работы.
В настоящее время я решаю сложную проблему и буду глубоко признателен за любую помощь. Мой проект включает в себя воспроизведение видео с использованием OpenCV, просмотр его кадр за кадром и одновременное представление текущего кадра на графике matplotlib серой линией, и все это в графическом интерфейсе на основе Tkinter.
Суть проблемы заключается в следующем: когда я запускаю свою программу в обычном режиме, серая линия, предназначенная для обозначения текущего кадра, не появляется на графике matplotlib. Однако когда я просматриваю код с помощью отладчика, все работает отлично, и строка выглядит так, как ожидалось.
Стоит также отметить, что хотя я использую Tkinter в качестве основного графического интерфейса, и matplotlib, и OpenCV настаивают на открытии отдельных окон для отображения, что не идеально.
Вот фрагмент моего кода для контекста:
импортировать cv2 импортировать matplotlib.pyplot как plt импортировать панд как pd импортировать matplotlib смещение = 0 крышка = 0 фрейм_фактор = 0 кадр/с = 0 line_references = {} последний_кадр = 0 защита инициализировать_линии(): глобальные line_references all_plots = [plt.figure(fig_id).gca() для fig_id в plt.get_fignums()] для i, топор в перечислении (all_plots): line = ax.axvline(x=0, color='gray') # Начальная позиция линии line_references = номер строки Speichern der Referenz mit einem eindeutigen Schlüssel (hier Index des Plots) защита update_plots (current_frame): глобальные line_references,frame_factor,смещение текущая_позиция = (коэффициент_кадра * текущий_кадр) / 1000 — смещение для меня строка в line_references.items(): line.set_xdata([current_position]) # Установить новую позицию линии line.figure.canvas.draw_idle() # Фордирование eine Neuberechnung des Plots andef update_plots(current_frame): защита play_video(file_path): глобальный is_playing, cap, fps,quit_video,is_programmatic_change_trackbar,offset,frame_factor,last_frame длительность_in_ms = int(video_duration_text_field.get()) offset_string = video_offset_text_field.get().replace(',', '.') смещение = float(строка_смещения) cap = cv2.VideoCapture(путь_файла) fps = cap.get(cv2.CAP_PROP_FPS) # получаем fps total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # получаем общее количество кадров длительность = total_frames / fps # продолжительность видео cv2.namedWindow('Видео сбоя', cv2.WINDOW_NORMAL) защита trackbar_callback(pos): если нет is_programmatic_change_trackbar: cap.set(cv2.CAP_PROP_POS_FRAMES, pos) cv2.createTrackbar('Frame', 'Crash Video', 0, total_frames - 1, trackbar_callback) коэффициент_фрейма = длительность_в_мс / общее количество_кадров is_playing = True # Добавление кнопки воспроизведения видео инициализировать_линии() пока is_playing: ret, кадр = cap.read() current_frame = int(cap.get(cv2.CAP_PROP_POS_FRAMES)) текущее_время = текущий_кадр / кадр/с is_programmatic_change_trackbar = Истина cv2.setTrackbarPos('Кадр', 'Видео сбоя', current_frame) is_programmatic_change_trackbar = Ложь update_plots(current_frame) # Актуальные графики cv2.imshow('Видео аварии', кадр) cv2.waitKey(int((1 / fps) * 1000)) """if key == ord('q'): перерыв если ключ == ord('s'): cv2.waitKey(-1)""" # ждем, пока не будет нажата любая клавиша""" is_playing = Ложь plot_queue.put("выход") delete_lines() cv2.destroyAllWindows() защита add_video(): file_path = filedialog.askopenfilename(title="Выберите видеофайл", filetypes=[("Видеофайлы", "*.mp4;*.avi;*.mkv"), ("Все файлы", "*.*")]) если путь_файла: play_video(путь_к файлу)
В настоящее время я решаю сложную проблему и буду глубоко признателен за любую помощь. Мой проект включает в себя воспроизведение видео с использованием OpenCV, просмотр его кадр за кадром и одновременное представление текущего кадра на графике matplotlib серой линией, и все это в графическом интерфейсе на основе Tkinter.
Суть проблемы заключается в следующем: когда я запускаю свою программу в обычном режиме, серая линия, предназначенная для обозначения текущего кадра, не появляется на графике matplotlib. Однако когда я просматриваю код с помощью отладчика, все работает отлично, и строка выглядит так, как ожидалось.
Стоит также отметить, что хотя я использую Tkinter в качестве основного графического интерфейса, и matplotlib, и OpenCV настаивают на открытии отдельных окон для отображения, что не идеально.
Вот фрагмент моего кода для контекста:
импортировать cv2 импортировать matplotlib.pyplot как plt импортировать панд как pd импортировать matplotlib смещение = 0 крышка = 0 фрейм_фактор = 0 кадр/с = 0 line_references = {} последний_кадр = 0 защита инициализировать_линии(): глобальные line_references all_plots = [plt.figure(fig_id).gca() для fig_id в plt.get_fignums()] для i, топор в перечислении (all_plots): line = ax.axvline(x=0, color='gray') # Начальная позиция линии line_references = номер строки Speichern der Referenz mit einem eindeutigen Schlüssel (hier Index des Plots) защита update_plots (current_frame): глобальные line_references,frame_factor,смещение текущая_позиция = (коэффициент_кадра * текущий_кадр) / 1000 — смещение для меня строка в line_references.items(): line.set_xdata([current_position]) # Установить новую позицию линии line.figure.canvas.draw_idle() # Фордирование eine Neuberechnung des Plots andef update_plots(current_frame): защита play_video(file_path): глобальный is_playing, cap, fps,quit_video,is_programmatic_change_trackbar,offset,frame_factor,last_frame длительность_in_ms = int(video_duration_text_field.get()) offset_string = video_offset_text_field.get().replace(',', '.') смещение = float(строка_смещения) cap = cv2.VideoCapture(путь_файла) fps = cap.get(cv2.CAP_PROP_FPS) # получаем fps total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # получаем общее количество кадров длительность = total_frames / fps # продолжительность видео cv2.namedWindow('Видео сбоя', cv2.WINDOW_NORMAL) защита trackbar_callback(pos): если нет is_programmatic_change_trackbar: cap.set(cv2.CAP_PROP_POS_FRAMES, pos) cv2.createTrackbar('Frame', 'Crash Video', 0, total_frames - 1, trackbar_callback) коэффициент_фрейма = длительность_в_мс / общее количество_кадров is_playing = True # Добавление кнопки воспроизведения видео инициализировать_линии() пока is_playing: ret, кадр = cap.read() current_frame = int(cap.get(cv2.CAP_PROP_POS_FRAMES)) текущее_время = текущий_кадр / кадр/с is_programmatic_change_trackbar = Истина cv2.setTrackbarPos('Кадр', 'Видео сбоя', current_frame) is_programmatic_change_trackbar = Ложь update_plots(current_frame) # Актуальные графики cv2.imshow('Видео аварии', кадр) cv2.waitKey(int((1 / fps) * 1000)) """if key == ord('q'): перерыв если ключ == ord('s'): cv2.waitKey(-1)""" # ждем, пока не будет нажата любая клавиша""" is_playing = Ложь plot_queue.put("выход") delete_lines() cv2.destroyAllWindows() защита add_video(): file_path = filedialog.askopenfilename(title="Выберите видеофайл", filetypes=[("Видеофайлы", "*.mp4;*.avi;*.mkv"), ("Все файлы", "*.*")]) если путь_файла: play_video(путь_к файлу)