天天看點

Python應用03 使用PyQT制作視訊播放器

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。

最近研究了Python的兩個GUI包,Tkinter和PyQT。這兩個GUI包的底層分别是Tcl/Tk和QT。相比之下,我覺得PyQT使用起來更加友善,功能也相對豐富。這一篇用PyQT實作一個視訊播放器,并借此來說明PyQT的基本用法。

先把已經完成的代碼放出來。代碼基于Python 3.5:

代碼實作了一個有GUI視窗的應用,用來播放視訊檔案。視訊播放利用了PyQT中的Phonon子產品。此外,還有一個程序每隔一秒發出一個信号。視窗在接收到信号後,更新視訊播放的時間。這個應用的效果如下:

Python應用03 使用PyQT制作視訊播放器

測試運作環境為Mac OSX El Capitan。

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

在PyQT程式中,QApplication是最上層的對象,指代整個GUI應用。我們在程式的一開始建立了一個應用對象,在程式最後調用exec_()來運作這個應用。sys.exit()用來要求應用的主循環結束後幹淨地退出程式。PyQT程式的開始和結尾都是類似的固定套路。關鍵就在于其間定義的QWidget對象。

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

QGridLayout把界面分成網格,并把某個視圖對象附着在特定的網格位置。比如說,addWidget()(self.info, 4, 1, 1, 3)表示把一個文本框對象放在第4排、第1列的位置。該文本框縱向将占據1排,橫向占據3列。這樣,上下層視圖的位置關系就通過布局确定了下來。除了網格式的布局,PyQT還支援其他形式的布局,如橫向堆砌、縱向堆砌等等,可以進一步了解。

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

這裡的QFileDialog對話框用于選擇檔案。對話框将通路所選檔案的路徑。除了檔案選擇,對話框還有确認對話框、檔案輸入對話框、色彩對話框。這些對話框實作了不少常用的GUI輸入功能。通過利用這些對話框,可以減少程式員從頭開發的工作量。

GUI界面的主線程通常留給應用做主循環。其他的很多工作要通過其他的線程來完成。PyQT多線程程式設計很簡單,隻需要重寫QThread的run()方法就可以了:

建立線程後,隻需要調用start()方法,就可以運作:

GUI經常要用到異步處理。比如說點選某個按鈕,然後調用相應的回調函數。QT的“信号與槽”(signal-slot)機制就是為了解決異步處理問題。我們線上程中建立了信号,并通過emit()方法來發出信号:

有了信号,我們就可以給該信号連接配接到一個“槽”,其實就是對應于該信号的回調函數:

每當信号被發出時,“槽”就會被調用。在這個例子中,就是更新視訊播放時間。QT中的“信号與槽”是普遍存在的機制。一些組建如按鍵,預設了“點選”這樣的信号,可以直接對應到“槽”。如代碼中的:

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