pyqt漂亮gui界⾯模板_⼲货分享,Python与PyQT制作视频播
放器
最近研究了Python的两个GUI包,Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相⽐之下,我觉得PyQT使⽤起来更加⽅便,功能也相对丰富。这⼀篇⽤PyQT实现⼀个视频播放器,并借此来说明PyQT的基本⽤法。
视频播放器
先把已经完成的代码放出来。代码基于Python 3.5:
import time
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.phonon import 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
it()
else:
return
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
# media
self.video = Phonon.VideoWidget(self)
self.video.setMinimumSize(200, 200)
self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self)
数组元素不能是公式吗# control button
self.button = QtGui.QPushButton('选择⽂件', self)
self.t(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.t(self.update)
def update(self):
# slot
lapse = dia.currentTime()/1000.0
self.info.setText("%4.2f 秒" % lapse)
def startPlay(self):
if self.path:
# use a thread as a timer
self.thread = PollTimeThread(self)
self.t(self.update)
self.thread.start()
def handleButton(self):
dia.state() == Phonon.PlayingState:
inate()
else:
self.path = OpenFileName(self, ())
self.startPlay()
def handleStateChanged(self, newstate, oldstate):
if newstate == Phonon.PlayingState:
self.button.setText('停⽌')
elif (newstate != Phonon.LoadingState and
newstate != Phonon.BufferingState):
self.button.setText('选择⽂件')
python入门教程视屏
if newstate == Phonon.ErrorState:
source = dia.currentSource().fileName()
print ('错误:不能播放:', Local8Bit().data())
print ('  %s' % String().toLocal8Bit().data())
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
app.setApplicationName('视频播放')
window = Window()
window.show()
<_())
代码实现了⼀个有GUI窗⼝的应⽤,⽤来播放视频⽂件。视频播放利⽤了PyQT中的Phonon模块。此外,还有⼀个进程每隔⼀秒发出⼀个信号。窗⼝在接收到信号后,更新视频播放的时间。这个应⽤的效果如下:
bt蚂蚁磁力搜索天堂测试运⾏环境为Mac OSX El Capitan。
视图部分
写完这个代码之后,我发现这个代码虽然简单,但涉及了⼏个重要机制,可以⽤PyQT的练习题。下⾯对代码进⾏⼀些简要的说明,⾸先是主程序部分:
app = QtGui.QApplication(sys.argv)
...
window = Window()
window.show()
<_())
在PyQT程序中,QApplication是最上层的对象,指代整个GUI应⽤。我们在程序的⼀开始创建了⼀个应⽤对象,在程序最后调⽤exec_()来运⾏这个应⽤。it()⽤来要求应⽤的主循环结束后⼲净地退出程序。PyQT程序的开始和结尾都是类似的固定套路。关键就在于其间定义的QWidget对象。
我们⾃定义的Window类继承⾃QWidget。其实QWidget是所有⽤户界⾯对象的基类,并不单单指代⼀个窗⼝。表格、输⼊框、按钮都继承⾃QWidget。在⼀个Window对象中,我们还组合有QPushButton和QLabel这样的对象,分别代表⼀个按钮和⼀个⽂本框。它们通过QGridLayout的⽅式,布局在Window的界⾯上,即下⾯⼀部分代码:
# layout
layout = QtGui.QGridLayout(self)
...
layout.addWidget(self.info, 4, 1, 1, 3)
layout.addWidget(self.button, 5, 1, 1, 3)
QGridLayout把界⾯分成⽹格,并把某个视图对象附着在特定的⽹格位置。⽐如说,addWidget()(self.info, 4, 1, 1, 3)表⽰把⼀个⽂本框对象放在第4排、第1列的位置。该⽂本框纵向将占据1排,横向占据3列。这样,上下层视图的位置关系就通过布局确定了下来。除了⽹格
式的布局,PyQT还⽀持其他形式的布局,如横向堆砌、纵向堆砌等等,可以进⼀步了解。
除了QWidget,PyQT还提供了常⽤的对话框,如:
self.path = OpenFileName(self, ())
这⾥的QFileDialog对话框⽤于选择⽂件。对话框将访问所选⽂件的路径。除了⽂件选择,对话框还有确认对话框、⽂件输⼊对话框、⾊彩对话框。这些对话框实现了不少常⽤的GUI输⼊功能。通过利⽤这些对话框,可以减少程序员从头开发的⼯作量。
多线程
GUI界⾯的主线程通常留给应⽤做主循环。其他的很多⼯作要通过其他的线程来完成。PyQT多线程编程很简单,只需要重写QThread的run()⽅法就可以了:
class PollTimeThread(QtCore.QThread):
def __init__(self, parent):
super(PollTimeThread, self).__init__(parent)
def run(self):
...
用switch判断成绩创建线程后,只需要调⽤start()⽅法,就可以运⾏:
self.thread = PollTimeThread()
...
self.thread.start()      # 启动线程
...
inate()  # 终⽌线程
信号与槽
GUI经常要⽤到异步处理。⽐如说点击某个按钮,然后调⽤相应的回调函数。QT的“信号与槽”(signal-slot)机制就是为了解决异步处理问题。我们在线程中创建了信号,并通过emit()⽅法来发出信号:
系统架构师题型
class PollTimeThread(QtCore.QThread):
"""
This thread works as a timer.
"""
三角函数值表0到360度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
it()
else:
return
有了信号,我们就可以给该信号连接到⼀个“槽”,其实就是对应于该信号的回调函数:
self.t(self.update)
每当信号被发出时,“槽”就会被调⽤。在这个例⼦中,就是更新视频播放时间。QT中的“信号与槽”是普遍存在的机制。⼀些组建如按键,预设了“点击”这样的信号,可以直接对应到“槽”。如代码中的:
self.t(self.handleButton)
此外,Phonon是⼀个很好⽤的多媒体模块,使⽤⽅法也很简单,可以参考代码本⾝,这⾥不再赘述。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。