python+pyqt5设置窗体图标和任务栏图标及窗体标题的方法

本次设置窗体标题只用了一种方法,在进行窗体实例化后window = Window(),使用setWindowTitle(str)命令,在主程序中的设置命令如下所示:

if __name__ == '__main__':

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开始,支持High-DP
    app = QApplication(sys.argv)
    window = Window()

    # 设置窗口标题
    window.setWindowTitle('真棒')

    window.show()
    sys.exit(app.exec_())

本文主要讨论设置窗体图标及任务栏图标的问题,本次使用了四种方法实现了窗体图标的设置。方法一和方法二在通过pyinstaller转换为exe文件后,需要将图标放入exe文件目录,方法三和方法四将图标转换为.py文件可以和exe文件一起打包,无需再转存图标文件。这些方法均需在主函数的代码段

if __name__ == '__main__':

中进行添加

在模块中开头引用中需添加以下代码,否则任务栏图标不显示

import ctypes
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")

1.方法一:QPixmap

将ico图标通过QPixmap方法进行设置,QPixmap方法对图标的放大效果较好,但是几十k的图标文件会被放大几倍或十几倍,更占据内存空间,因此该方法更适用于较小的图片。

if __name__ == '__main__':

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开始,支持High-DP
    app = QApplication(sys.argv)
    window = Window()

    # 方法一:设置窗口图标,此方法占内存多,但图标显示效果较好,适用于较小的图片
    ico_path = os.path.join(os.path.dirname(__file__), 'subway.ico')
    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap(ico_path), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    window.setWindowIcon(icon)

    # 设置窗口标题
    window.setWindowTitle('真棒')

    window.show()
    sys.exit(app.exec_())

2.方法二:setWindowIcon(QIcon("./subway.ico"))

此方法直接将ico图片设置为窗体图标显示效果不如方法一,适用于较大的图片

if __name__ == '__main__':

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开始,支持High-DP
    app = QApplication(sys.argv)
    window = Window()

    # 方法二:设置窗口图标,此方法占内存小,显示效果不如方法一,适用于较大的图片
    window.setWindowIcon(QIcon("./subway.ico"))

    # 设置窗口标题
    window.setWindowTitle('真棒')

    window.show()
    sys.exit(app.exec_())

3.方法三:base64

本方法引用文章Python文件带图片打包exe(Pyinstaller)https://blog.csdn.net/ziigea/article/details/112647727#:~:text=Python%E6%96%87%E4%BB%B6%E5%B8%A6%E5%9B%BE%E7%89%87%E6%89%93%E5%8C%85exe%EF%BC%88Pyinstaller%EF%BC%89%201%201.%E5%AE%89%E8%A3%85%20pip%20install%20pywin32%20pip%20install,2.%20%E4%B8%8D%E5%8A%A0%E2%80%93noupx%E5%8F%AF%E6%89%93%E5%8C%85%E6%88%90%E5%8A%9F%EF%BC%8C%E4%BD%86%E6%96%87%E4%BB%B6%E5%8F%AF%E8%83%BD%E9%97%AA%E9%80%80%203%203.%E5%9B%BE%E7%89%87%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%20%E5%A6%82%E6%9E%9C%E6%9C%89%E5%9B%BE%E7%89%87%E6%96%87%E4%BB%B6%EF%BC%8C%E5%88%99%E9%A1%BB%E5%9C%A8%E6%89%93%E5%8C%85%E4%B9%8B%E5%89%8D%E6%8A%8A%E5%9B%BE%E7%89%87%E8%BD%AC%E5%8C%96%E6%88%90py%E6%96%87%E4%BB%B6%EF%BC%8C%E5%86%8D%E4%BD%BF%E7%94%A8%E4%B8%8A%E8%BF%B0%E6%96%B9%E6%B3%95%E6%89%93%E5%8C%85%E3%80%82%20%E8%BF%99%E9%87%8C%E9%87%87%E7%94%A8base64%E6%A0%BC%E5%BC%8F%20PicToPy.py%20

将图片转化为base64格式,保存在.py文件中,在进行打包时可以将图标直接放入exe文件中,无需再exe目录中再保存ico图标文件。

PicToPy.py

import base64

def pictopy(picture_names, py_name):
    """
    将图像文件转换为py文件
    :param picture_name:
    :return:
    """
    write_data = []
    for picture_name in picture_names:
        filename = picture_name.replace('.', '_')
        open_pic = open("%s" % picture_name, 'rb')
        b64str = base64.b64encode(open_pic.read())
        open_pic.close()
        # 注意这边b64str一定要加上.decode()
        write_data.append('%s = "%s"\n' % (filename, b64str.decode()))

    f = open('%s.py' % py_name, 'w+')
    for data in write_data:
        f.write(data)
    f.close()


# pics = ["logo_2.png", "logo.ico"] 中的图片存放在PicToPy.py同一目录中,运行完成后,
# 会在当前路径看到一个memory_pic.py文件
pics = ["logo_2.png", "subway.ico"]
pictopy(pics, 'memory_pic')  # 将pics里面的图片写到 memory_pic.py 中
print("ok")

在通过PicToPy.py对图片进行转存后,图片保存在memory_pic.py文件。

在主函数中对图标进行调用,注意图片文件在转化后命名规则变为“文件名_文件类型”,本项目中subway.ico变为subway_ico,代码如下:

import base64
from memory_pic import subway_ico

if __name__ == '__main__':

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开始,支持High-DP
    app = QApplication(sys.argv)
    window = Window()

    # 方法三:把图片转化为base64格式
    Logo = QtGui.QPixmap()
    Logo.loadFromData(base64.b64decode(subway_ico))
    icon = QtGui.QIcon()
    icon.addPixmap(Logo, QtGui.QIcon.Normal, QtGui.QIcon.Off)
    window.setWindowIcon(icon)

    # 设置窗口标题
    window.setWindowTitle('真棒')

    window.show()
    sys.exit(app.exec_())

4.方法四:通过pyqt的QTDesigner

在使用pyqt进行窗口资源管理时,可以将.qrc文件通过PyRCC将图片转化为.py文件,再在主函数中引用即可

python+pyqt5设置窗体图标和任务栏图标及窗体标题的方法_第1张图片

 通过“编辑样式表”打开“添加资源”按钮,通过编辑资源将图标文件添加到.qrc文件,使用PyRCC将rec.qrc(可以另起名字)转化为rec.py。主函数中代码如下:

import ico_rc  # 必须引用图标文件,不然图标不显示

if __name__ == '__main__':

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开始,支持High-DP
    app = QApplication(sys.argv)
    window = Window()

    # 方法四:
    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap(":/ico/subway.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    window.setWindowIcon(icon)

    # 设置窗口标题
    window.setWindowTitle('真棒')

    window.show()
    sys.exit(app.exec_())

此方法较方法三,在使用pyqt时省去了使用PicToPy.py对图片进行转化的操作,可以直接通过PyRCC将图片转换为.py文件,其中":/ico/subway.ico"为图标文件在添加到资源.qrc文件中的路径

参考链接:

Python文件带图片打包exe(Pyinstaller)

python+pyqt5+pyinstaller 将ico图标打包进exe方法

QPixmap、QIcon和QImage

手把手教你pyqt中.qrc图片文件的编写和使用

你可能感兴趣的:(PyQt,qt,开发语言,python)