python GUI PyQt5小结

系统:Linux Mint 18.3 xfce 64bit
需要软件:
(1)Qt5.9.1(使用其中的designer设计师软件来构建ui文件)
(2)pygame(播放音乐)
(3)python3(系统自带3.5版本)

上一篇记录了tkinter的基本控件使用,趁热打铁,把PyQt5的基本控件也学习了,下面的例子实现了和之前tkinter一样的简单音乐播放器。

(1)打开designer,如果是直接安装整个Qt程序的在安装目录下会找到该程序,如果是其他方式安装的,如apt、yum等包管理器安装的直接在命令行输入designer打开即可,拖动控件,使用到的控件有QLabel,QLineEdit,QPushButton ,构建如下的ui样式,里面红线是布局管理
python GUI PyQt5小结_第1张图片

注意ui中的三个按钮,将相应的对象名设置为btnBrowse、btnPlay、btnStop ,,后面代码会用到,其他几个控件对象名默认,同时也加上几个菜单,如代码中实现的退出程序
python GUI PyQt5小结_第2张图片

(2)保存文件,文件名自定,我的为musicplay.ui
(3)实例代码,实现的操作有
1)打开文件浏览器,选择具体格式的文件,返回文件名(含路径)
2)向QLineEdit 写入内容setText
3) 设置程序图标
4)显示控件提示setToolTip
5)显示状态提示setStatusTio
6) 显示消息对话框
7)使用pygame模块播放、停止mp3音乐
8)添加工具栏toolBar

代码如下

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb  8 17:23:32 2018

@author: 周文青

使用PyQt5构建简单GUI程序
"""

import sys
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QMessageBox
from PyQt5.QtWidgets import QFileDialog, QAction, qApp
from PyQt5.QtGui import QIcon
import pygame

# 使用QtCreator建立的ui文件路径
qtCreatorFile = "/home/kindy/Files/python/gui/pyqt/musicplay.ui" 
# 使用uic加载
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QMainWindow, Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        super().__init__()
        self.initUI()       # 调用自定义的UI初始化函数initUI()

    def initUI(self):
        '''
        Initialize the window's UI
        '''
        self.setupUi(self)
        self.setWindowTitle("简单音乐播放器")
        self.setWindowIcon(QIcon("/home/kindy/Files/python/gui/pyqt/rocket.png"))   # 设置图标,linux下只有任务栏会显示图标

        self.initMenuBar()      # 初始化菜单栏
        self.initToolBar()      # 初始化工具栏
        self.initButton()       # 初始化按钮

        self.show()             # 显示

    def initMenuBar(self):
        '''
        初始化菜单栏
        '''
        self.actionExit.triggered.connect(qApp.quit)    # 按下菜单栏的Exit按钮会退出程序
        self.actionExit.setStatusTip("退出程序")         # 左下角状态提示
        self.actionExit.setShortcut('Ctrl+Q')           # 添加快捷键

    def initToolBar(self):
        '''
        初始化工具栏
        创建一个QAction实例exitAct,然后添加到designer已经创建的默认的工具栏toolBar里面
        '''
        exitAct = QAction(QIcon('/home/kindy/Files/python/gui/pyqt/exit.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        self.toolBar.addAction(exitAct)

    def initButton(self):
        '''
        Initialize the Buttons
        btnBrowse: browse the file explorer
        btnPlay: begin to play music using module pygame
        btnStop: stop playing music
        '''
        self.btnBrowse.clicked.connect(self.browserButton_callback) # 按下按钮调用回调函数
        self.btnBrowse.setToolTip("浏览音乐文件")                     # 设置提示
        #self.btnBrowse.setStyleSheet("{border-image: url(/home/kindy/Files/python/gui/pyq/play.ico);}") # 此代码没有效果
        self.btnPlay.clicked.connect(self.playButton_callback)      # 一旦按下按钮,连接槽函数进行处理
        self.btnPlay.setToolTip("播放音乐文件")
        self.btnStop.clicked.connect(self.stopButton_callback)
        self.btnStop.setToolTip("停止播放")

    def browserButton_callback(self):
        global fileName1    # 设置全局
        fileName1, filetype = QFileDialog.getOpenFileName(self,
                                    "选取文件",
                                    "/home/kindy/音乐",
                                    "All Files (*);;Music Files (*.mp3)")   #设置文件扩展名过滤,注意用双分号间隔
        self.lineEdit.setText(fileName1)

    def playButton_callback(self):
        '''
        播放音乐
        '''
        global fileName1
    #    playButton.configure(image=pause)
        pygame.mixer.init()
        pygame.mixer.music.load(fileName1)
        pygame.mixer.music.play()   # 播放音乐

    def stopButton_callback(self):
        '''
        停止播放
        '''
        pygame.mixer.music.stop()

    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes |
            QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    sys.exit(app.exec_())

效果如下:
python GUI PyQt5小结_第3张图片

参考链接:
(1)http://www.cnblogs.com/archisama/p/5444032.html
(2)http://zetcode.com/gui/pyqt5/menustoolbars/

你可能感兴趣的:(Python)