Docker container 안에서 PyQt5, designer 사용하기

2021.05.14 기준


1. 쿠다 및 cudnn 설치된 nvidia docker image 사용 
(디스플레이 사용 및 opengl 사용을 위한 옵션들 포함)
docker run --gpus all -it --name gui1 -v /home/hayoung/Desktop/:/data --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" -e NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute nvidia/cuda:11.2.2-cudnn8-devel-ubuntu18.04

2. gl 라이브러리 설치
apt install -y -qq --no-install-recommends libglvnd0 libgl1 libglx0 libegl1 libxext6 libx11-6
rm -rf /var/lib/apt/lists/*

3. 도커 밖에서 xhost 설정
xhost +local:'docker inspect --format='{{.Config.Hostname}}' bdba249440d4'

4. PyQt5 설치
pip install PyQt5
(apt install python3-pyqt5 와 중복사용?)
apt install qttools5-dev-tools
apt install libpulse-dev
apt install libqtSmultimediaS-plugins

apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

5. Designer 실행
/usr/lib/x86_64-linux-gnu/qt5/bin/designer

6. Designer로 temp.ui 생성

7. Example code 실행
from PyQt5 import QtWidgets, uic
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl
import sys


class UI(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.ui = uic.loadUi('/workspace/temp.ui', self)
# self.ui.setupUi(self)
# self.ui.pushButton.clicked.connect(self.show_text)
self.ui.pushButton.clicked.connect(self.get_videopath)
self.ui.pushButton_2.clicked.connect(self.playpause)
self.ui.pushButton_2.setEnabled(False)
self.lineEdit.returnPressed.connect(self.set_videopath)

self.player = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.player.setVideoOutput(self.videowidget)

#-------------
self.videopath = ''
#-------------

self.ui.show()
# def show_text(self):
# self.text = "Hello World!"
# self.lineEdit.setText(self.text)
def set_videopath(self):
self.videopath = self.lineEdit.text()
# print(self.videopath)
if self.videopath != '':
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(self.videopath)))
self.ui.pushButton_2.setEnabled(True)
def get_videopath(self):
filter = "Videos(*.mp4 *.avi *.mpeg)"
self.videopath = QtWidgets.QFileDialog.getOpenFileName(self, filter=filter)[0]
# print(self.videopath)
if self.videopath != '':
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(self.videopath)))
self.ui.pushButton_2.setEnabled(True)
def playpause(self):
if self.player.state() == QMediaPlayer.PlayingState:
self.player.pause()
else:
self.player.play()


if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = UI()
app.exec_()





ERROR:
AL lib: (EE) ALCplaybackAlsa_open: Could not open playback device 'default': No such file or directory
사운드 관련한 에러인듯함.
도커 컨테이너 생성 시
-e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native
-v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native
추가해주면 사라짐.
--group-add $(getent group audio | cut -d: -f3)
옵션은 없어도 일단 에러 나지 않음.

참고 싸이트:

댓글

이 블로그의 인기 게시물

sklearn tsne + matplotlib scatter

Implementation of Focal Loss using Pytorch