PYTQ + ico图标制作

PYTQ + ico图标制作

在使用QT,或者pyqt的过程中,经常会因为没有图标而烦恼。(把自己喜欢的图片转换成ico格式,用在程序的图标显示上)
先看下效果图:


image.png

于是就用pyqt制作一个转ico的工具,方便使用。

这里使用到PythonMagick库文件:这里介绍了这个库文件的安装

接下来就是上代码了:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'imageToIco.ui'
#
# Created by: PyQt5 UI code generator 5.7.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import os
import PythonMagick
global_path = "C:/"
global_ico = []
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(758, 591)
        MainWindow.setMinimumSize(QtCore.QSize(758, 591))
        MainWindow.setMaximumSize(QtCore.QSize(758, 591))
        MainWindow.setStyleSheet("background-color: rgb(203, 242, 255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)

        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(19, 79, 721, 481))
        self.groupBox.setStyleSheet("background-color: rgb(249, 249, 249)")
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit.setGeometry(QtCore.QRect(110, 30, 481, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(30, 30, 72, 21))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        self.pushButton.setGeometry(QtCore.QRect(610, 30, 71, 21))
        self.pushButton.setStyleSheet("background-color: rgb(203, 242, 255);")
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_2.setGeometry(QtCore.QRect(610, 70, 71, 21))
        self.pushButton_2.setStyleSheet("background-color: rgb(203, 242, 255);")
        self.pushButton_2.setObjectName("pushButton_2")
        self.tableWidget = QtWidgets.QTableWidget(self.groupBox)
        self.tableWidget.setGeometry(QtCore.QRect(30, 111, 661, 351))
        self.tableWidget.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setGeometry(QtCore.QRect(30, 70, 72, 21))
        self.label_3.setObjectName("label_3")
        self.lineEdit_w = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_w.setGeometry(QtCore.QRect(110, 70, 61, 21))
        self.lineEdit_w.setObjectName("lineEdit_w")
        self.label_4 = QtWidgets.QLabel(self.groupBox)
        self.label_4.setGeometry(QtCore.QRect(180, 70, 31, 21))
        self.label_4.setObjectName("label_4")
        self.lineEdit_h = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_h.setGeometry(QtCore.QRect(200, 70, 61, 21))
        self.lineEdit_h.setObjectName("lineEdit_h")
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(20, 10, 721, 61))
        self.groupBox_2.setTitle("")
        self.groupBox_2.setObjectName("groupBox_2")
        self.label_2 = QtWidgets.QLabel(self.groupBox_2)
        self.label_2.setGeometry(QtCore.QRect(230, 10, 271, 41))
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.pushButton.clicked.connect(self.openFile)
        self.pushButton_2.clicked.connect(self.toIco)


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "WB_转ico"))
        MainWindow.setWindowIcon(QtGui.QIcon("wb.ico"))
        self.label.setText(_translate("MainWindow", "PDF文件:"))
        self.pushButton.setText(_translate("MainWindow", "选取文件"))
        self.pushButton_2.setText(_translate("MainWindow", "开始转换"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "源文件"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "尺寸"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "备注"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "下载"))

        self.label_3.setText(_translate("MainWindow", "尺   寸:"))
        self.lineEdit_w.setText(_translate("MainWindow", "128"))
        self.label_4.setText(_translate("MainWindow", "X"))
        self.lineEdit_h.setText(_translate("MainWindow", "128"))
        self.tableWidget.horizontalHeader().setStyleSheet("QHeaderView::section {background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,\
                                                                        stop:0 #00007f, stop: 0.5 #00007f,stop: 0.6 #00007f, stop:1 #00007f);color: white;}")
        self.label_2.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-size:20pt; font-weight:600; color:#55aa00;\">图片转ico</span></p></body></html>"))

        self.tableWidget.setColumnWidth(0, 300)
        self.tableWidget.setColumnWidth(1, 100)
        self.tableWidget.setColumnWidth(2, 100)

    def openFile(self):
        # fileName = QtWidgets.QFileDialog.getOpenFileName(self, "选择文件", self.directory, "Text Files(*.xml)")
        global global_path
        fileName, filetype = QtWidgets.QFileDialog.getOpenFileName(self.centralwidget,
                                                         "选取文件",
                                                         global_path,
                                                         "PNG Files(*.png);;JPEG Files(*.jpg)")  # 设置文件扩展名过滤,注意用双分号间隔
        if fileName == '':
            print('取消')
            return
        # print(os.path.basename( fileName) ) # 返回文件名
        # print(os.path.dirname(fileName))  # 返回目录路径
        # print(os.path.split(fileName))  # 分割文件名与路径
        # print(os.path.join(os.path.dirname(fileName), 'runoob.txt'))  # 将目录和文件名合成一个路径

        global_path = os.path.dirname(fileName)
        self.lineEdit.setText(fileName)


    def toIco(self):
        global global_ico

        if self.lineEdit.text() == "":
            QtWidgets.QMessageBox.warning(self.centralwidget, "提示", "请选取转换文件")
            return

        if not os.path.exists(self.lineEdit.text()):
            QtWidgets.QMessageBox.warning(self.centralwidget, "提示", "文件不存在!")
            return

        if self.lineEdit_w.text() == '' or self.lineEdit_h.text() == '':
            QtWidgets.QMessageBox.warning(self.centralwidget, "提示", "请输入尺寸!")
            return

        path = self.lineEdit.text()
        size = self.lineEdit_w.text() + "x" + self.lineEdit_h.text()
        index = self.tableWidget.rowCount()
        try:
            img = PythonMagick.Image(path)
            # 这里要设置一下尺寸,不然会报ico尺寸异常错误
            img.sample(size)
            global_ico.append(img)
            self.tableWidget.setRowCount(index + 1)
            self.tableWidget.setItem(index, 0, QtWidgets.QTableWidgetItem(path))
            self.tableWidget.setItem(index, 1, QtWidgets.QTableWidgetItem(size))
            self.tableWidget.setItem(index, 2, QtWidgets.QTableWidgetItem("成功"))
            item1 = QtWidgets.QPushButton(self.centralwidget)
            item1.setObjectName(str(index))
            item1.clicked.connect(self.save_ico)
            item1.setText("下载")

            self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 3, item1)
        except:
            self.tableWidget.setRowCount(index + 1)
            self.tableWidget.setItem(index, 0, QtWidgets.QTableWidgetItem(path))
            self.tableWidget.setItem(index, 1, QtWidgets.QTableWidgetItem(size))
            self.tableWidget.setItem(index, 2, QtWidgets.QTableWidgetItem("失败"))
            QtWidgets.QMessageBox.warning(self.centralwidget, "提示", "转换失败!")

    def save_ico(self):
        global global_ico
        global global_path
        directory = QtWidgets.QFileDialog.getExistingDirectory(self.centralwidget,
                                                     "保存路径",
                                                     global_path)  # 起始路径
        if directory == '':
            print('取消')
            return
        new_path = directory
        index = int(self.tableWidget.sender().objectName())
        name = os.path.basename( self.tableWidget.item(index,0).text()) # 返回文件名
        name_list = name.split('.')
        name = name_list[0] + '.ico'
        global_ico[index].write(os.path.join(new_path , name))

if __name__ =='__main__':

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

如果代码都不想看,直接下载打包好的程序:ico图标制作

提取码:2bam

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342