日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例

發(fā)布時間:2023/12/10 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近研究了Python的兩個GUI包,Tkinter和PyQT。這兩個GUI包的底層分別是Tcl/Tk和QT。相比之下,我覺得PyQT使用起來更加方便,功能也相對豐富。這一篇用PyQT實現(xiàn)一個視頻播放器,并借此來說明PyQT的基本用法。

視頻播放器

先把已經(jīng)完成的代碼放出來。代碼基于Python 3.5:

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

import time

import sys

from PyQt4import QtGui, QtCore

from PyQt4.phononimport Phonon

class PollTimeThread(QtCore.QThread):

"""

This thread works as a timer.

"""

update= QtCore.pyqtSignal()

def __init__(self, parent):

super(PollTimeThread,self).__init__(parent)

def run(self):

while True:

time.sleep(1)

if self.isRunning():

# emit signal

self.update.emit()

else:

return

class Window(QtGui.QWidget):

def __init__(self):

QtGui.QWidget.__init__(self)

# media

self.media= Phonon.MediaObject(self)

self.media.stateChanged.connect(self.handleStateChanged)

self.video= Phonon.VideoWidget(self)

self.video.setMinimumSize(200,200)

self.audio= Phonon.AudioOutput(Phonon.VideoCategory,self)

Phonon.createPath(self.media,self.audio)

Phonon.createPath(self.media,self.video)

# control button

self.button= QtGui.QPushButton('選擇文件',self)

self.button.clicked.connect(self.handleButton)

# for display of time lapse

self.info= QtGui.QLabel(self)

# layout

layout= QtGui.QGridLayout(self)

layout.addWidget(self.video,1,1,3,3)

layout.addWidget(self.info,4,1,1,3)

layout.addWidget(self.button,5,1,1,3)

# signal-slot, for time lapse

self.thread= PollTimeThread(self)

self.thread.update.connect(self.update)

def update(self):

# slot

lapse= self.media.currentTime()/1000.0

self.info.setText("%4.2f 秒" % lapse)

def startPlay(self):

if self.path:

self.media.setCurrentSource(Phonon.MediaSource(self.path))

# use a thread as a timer

self.thread= PollTimeThread(self)

self.thread.update.connect(self.update)

self.thread.start()

self.media.play()

def handleButton(self):

if self.media.state()== Phonon.PlayingState:

self.media.stop()

self.thread.terminate()

else:

self.path= QtGui.QFileDialog.getOpenFileName(self,self.button.text())

self.startPlay()

def handleStateChanged(self, newstate, oldstate):

if newstate== Phonon.PlayingState:

self.button.setText('停止')

elif (newstate != Phonon.LoadingStateand

newstate != Phonon.BufferingState):

self.button.setText('選擇文件')

if newstate== Phonon.ErrorState:

source= self.media.currentSource().fileName()

print ('錯誤:不能播放:', source.toLocal8Bit().data())

print (' %s' % self.media.errorString().toLocal8Bit().data())

if __name__== '__main__':

app= QtGui.QApplication(sys.argv)

app.setApplicationName('視頻播放')

window= Window()

window.show()

sys.exit(app.exec_())

代碼實現(xiàn)了一個有GUI窗口的應(yīng)用,用來播放視頻文件。視頻播放利用了PyQT中的Phonon模塊。此外,還有一個進程每隔一秒發(fā)出一個信號。窗口在接收到信號后,更新視頻播放的時間。這個應(yīng)用的效果如下:

測試運行環(huán)境為Mac OSX El Capitan。

視圖部分

寫完這個代碼之后,我發(fā)現(xiàn)這個代碼雖然簡單,但涉及了幾個重要機制,可以用PyQT的練習題。下面對代碼進行一些簡要的說明,首先是主程序部分:

1

2

3

4

5

app= QtGui.QApplication(sys.argv)

...

window= Window()

window.show()

sys.exit(app.exec_())

在PyQT程序中,QApplication是最上層的對象,指代整個GUI應(yīng)用。我們在程序的一開始創(chuàng)建了一個應(yīng)用對象,在程序最后調(diào)用exec_()來運行這個應(yīng)用。sys.exit()用來要求應(yīng)用的主循環(huán)結(jié)束后干凈地退出程序。PyQT程序的開始和結(jié)尾都是類似的固定套路。關(guān)鍵就在于其間定義的QWidget對象。

我們自定義的Window類繼承自QWidget。其實QWidget是所有用戶界面對象的基類,并不單單指代一個窗口。表格、輸入框、按鈕都繼承自QWidget。在一個Window對象中,我們還組合有QPushButton和QLabel這樣的對象,分別代表一個按鈕和一個文本框。它們通過QGridLayout的方式,布局在Window的界面上,即下面一部分代碼:

1

2

3

4

5

# layout

layout= QtGui.QGridLayout(self)

...

layout.addWidget(self.info,4,1,1,3)

layout.addWidget(self.button,5,1,1,3)

QGridLayout把界面分成網(wǎng)格,并把某個視圖對象附著在特定的網(wǎng)格位置。比如說,addWidget()(self.info, 4, 1, 1, 3)表示把一個文本框?qū)ο蠓旁诘?排、第1列的位置。該文本框縱向?qū)⒄紦?jù)1排,橫向占據(jù)3列。這樣,上下層視圖的位置關(guān)系就通過布局確定了下來。除了網(wǎng)格式的布局,PyQT還支持其他形式的布局,如橫向堆砌、縱向堆砌等等,可以進一步了解。

除了QWidget,PyQT還提供了常用的對話框,如:

self.path = QtGui.QFileDialog.getOpenFileName(self, self.button.text())

這里的QFileDialog對話框用于選擇文件。對話框?qū)⒃L問所選文件的路徑。除了文件選擇,對話框還有確認對話框、文件輸入對話框、色彩對話框。這些對話框?qū)崿F(xiàn)了不少常用的GUI輸入功能。通過利用這些對話框,可以減少程序員從頭開發(fā)的工作量。

多線程

GUI界面的主線程通常留給應(yīng)用做主循環(huán)。其他的很多工作要通過其他的線程來完成。PyQT多線程編程很簡單,只需要重寫QThread的run()方法就可以了:

1

2

3

4

5

6

class PollTimeThread(QtCore.QThread):

def __init__(self, parent):

super(PollTimeThread,self).__init__(parent)

def run(self):

...

創(chuàng)建線程后,只需要調(diào)用start()方法,就可以運行:

1

2

3

4

5

self.thread= PollTimeThread()

...

self.thread.start()# 啟動線程

...

self.thread.terminate()# 終止線程

信號與槽

GUI經(jīng)常要用到異步處理。比如說點擊某個按鈕,然后調(diào)用相應(yīng)的回調(diào)函數(shù)。QT的“信號與槽”(signal-slot)機制就是為了解決異步處理問題。我們在線程中創(chuàng)建了信號,并通過emit()方法來發(fā)出信號:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class PollTimeThread(QtCore.QThread):

"""

This thread works as a timer.

"""

update= QtCore.pyqtSignal()

def __init__(self, parent):

super(PollTimeThread,self).__init__(parent)

def run(self):

while True:

time.sleep(1)

if self.isRunning():

# emit signal

self.update.emit()

else:

return

有了信號,我們就可以給該信號連接到一個“槽”,其實就是對應(yīng)于該信號的回調(diào)函數(shù):

1

self.thread.update.connect(self.update)

每當信號被發(fā)出時,“槽”就會被調(diào)用。在這個例子中,就是更新視頻播放時間。QT中的“信號與槽”是普遍存在的機制。一些組建如按鍵,預(yù)設(shè)了“點擊”這樣的信號,可以直接對應(yīng)到“槽”。如代碼中的:

1

self.button.clicked.connect(self.handleButton)

此外,Phonon是一個很好用的多媒體模塊,使用方法也很簡單,可以參考代碼本身,這里不再贅述。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/vamei/p/6139513.html

總結(jié)

以上是生活随笔為你收集整理的python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美日韩国产综合 | 久久精品视频中文字幕 | 色噜噜影院 | 清清草在线视频 | 婷婷五月在线视频 | 国产视频二区三区 | 欧美视频1区 | 爱av导航| av在线播放中文字幕 | 少妇捆绑紧缚av | 91大奶 | 五月少妇 | 日在线视频 | 一区二区三区四区精品视频 | 亚洲精品一区二三区 | 囯产精品一品二区三区 | 欧美性大战久久久久久 | 亚州黄色网址 | 无码人妻h动漫 | 国产小视频在线观看免费 | 水果视频污 | 97碰碰碰| 国产一区二区三区四区五区美女 | 人人射人人干 | 日本一级网站 | 国产精品一级二级三级 | 五十路japanese55丰满 | 日本丰满大乳奶做爰 | 偷拍亚洲欧美 | 成人免费在线网站 | 韩国美女视频在线观看18 | 亚洲色图20p | www.中文字幕.com | 久久噜噜色综合一区二区 | 久久夜夜操| 成人亚洲综合 | 欧美日韩在线高清 | 性高潮久久久久久久久 | 视频一区在线播放 | 成人免费毛片观看 | 男女曰逼视频 | 免费在线看污 | 国产a级片视频 | 在线免费观看你懂的 | 成人av网页 | 精品一区二区三区视频日产 | 亚洲不卡一区二区三区 | 午夜av免费在线观看 | 成人免费va视频 | 免费观看的毛片 | 麻豆影视网站 | 国产又黄又爽又色 | 成人亚洲玉足脚交系列 | 日韩亚洲欧美在线 | 日本免费网站视频 | 精品人妻av一区二区三区 | 爱露出 | 综合天天| 婚后打屁股高h1v1调教 | 欧美 亚洲 一区 | 成人h动漫精品一区二区器材 | 国产美女免费无遮挡 | 中文字幕一区二区三区人妻 | 亚洲综合99| 男男巨肉啪啪动漫3d | 九九自拍视频 | 波多野结衣在线一区二区 | 天天插综合网 | 黄色性视频 | 亚洲男人天堂2024 | 激情av在线 | 蜜臀久久99精品久久久画质超高清 | 黄网免费视频 | 在线亚洲+欧美+日本专区 | 在线观看成人一区 | www.xxxx欧美| 超碰人人擦 | 久久久com | 日韩欧美高清在线 | 国产成人精品久久二区二区91 | 99精品人妻无码专区在线视频区 | 国产一区网站 | 久久不射影院 | 麻豆激情视频 | 国产小视频在线免费观看 | 国产精品乱码久久久久久久久 | 好看的黄色录像 | 色久阁 | 麻豆国产精品视频 | 成人免费视频观看 | 天天干夜夜怕 | 欧洲一级黄 | 99视频 | 欧美自拍视频 | 侵犯女教师一区二区三区 | 欧美视频在线观看免费 | 天天草天天摸 | 91秘密入口 | 嫩草研究院在线观看 |