-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
128 lines (97 loc) · 3.96 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# imports
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, QSlider, QSizePolicy, QFileDialog, QMenu, QStyle
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt, QUrl, QPoint
SCREEN_SIZE = [800, 600]
class VideoPlayer(QWidget):
def __init__(self):
super().__init__()
# Задаём размер и название окна
self.setGeometry(350, 100, *SCREEN_SIZE)
self.setWindowTitle('VideoPlayer')
p = self.palette()
p.setColor(QPalette.Window, Qt.black)
self.setPalette(p)
self.initUI()
self.show()
def initUI(self):
# Creating mediaPlayer
self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
# Creating PushButton to Play
self.playBtn = QPushButton()
self.playBtn.setEnabled(False)
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.playBtn.clicked.connect(self.play_video)
# Creating PushButton to Open Video
oBtn = QPushButton('Open Video')
oBtn.clicked.connect(self.open_file)
# Creating Label
self.label = QLabel()
# Make sure that the slider is at the bottom
self.label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
# Creating videoWidget
videowidget = QVideoWidget()
# Creating Slider
self.slider = QSlider(Qt.Horizontal)
self.slider.setRange(0, 0)
self.slider.sliderMoved.connect(self.set_position)
# Creating Hbox
HboxLayout = QHBoxLayout()
HboxLayout.setContentsMargins(0, 0, 0, 0)
# Combining Widgets in a Hbox
HboxLayout.addWidget(oBtn)
HboxLayout.addWidget(self.playBtn)
HboxLayout.addWidget(self.slider)
# Creating Vbox
VboxLayout = QVBoxLayout()
# Combining Widgets in a Vbox
VboxLayout.addWidget(videowidget)
VboxLayout.addLayout(HboxLayout)
VboxLayout.addWidget(self.label)
# Add Video Output on widget
self.mediaPlayer.setVideoOutput(videowidget)
self.setLayout(VboxLayout)
# Triggers
self.mediaPlayer.stateChanged.connect(self.mediastate_changed)
self.mediaPlayer.positionChanged.connect(self.position_changed)
self.mediaPlayer.durationChanged.connect(self.duration_changed)
self.mediaPlayer.error.connect(self.handle_errors)
# function to open video from computer
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, "Open Video")
if filename != '':
self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(filename)))
self.playBtn.setEnabled(True)
# function to play/pause video
def play_video(self):
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
self.mediaPlayer.pause()
else:
self.mediaPlayer.play()
# function to change icon on play button
def mediastate_changed(self, state):
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
else:
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
# position tracking
def position_changed(self, position):
self.slider.setValue(position)
# duration tracking
def duration_changed(self, duration):
self.slider.setRange(0, duration)
# function to change position
def set_position(self, position):
self.mediaPlayer.setPosition(position)
# Custom errors
def handle_errors(self):
self.playBtn.setEnabled(False)
self.label.setText("Error: " + self.mediaPlayer.errorString())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = VideoPlayer()
ex.show()
sys.exit(app.exec())