python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉
最終效果

前言
這是最近在學(xué)qt這個(gè)東西,然后又學(xué)會(huì)了調(diào)用api,然后就想了用pyqt5做一個(gè)GUI界面,后期也可以打包分享給其他人使用,所以就最近就寫了一個(gè)簡(jiǎn)便的gui界面,有點(diǎn)不好看,大家湊合看一下,主要是學(xué)思路的哈!
1.PyQt5的安裝。
1.PyQt5庫(kù)的安裝。
PyQt5的安裝有兩個(gè)辦法。
1:pip install —xxx(庫(kù)名)
2:把這三個(gè)庫(kù)都下載。

?3:配置qt designer

Name:我們自己給這個(gè)tool起的名字
Program:填入designer.exe的路徑,每個(gè)人路徑不同,找到自己計(jì)算機(jī)上的 路徑輸進(jìn)去。一般來(lái)說(shuō)是在site-packages\QtDesigner\designer.exe這里。
Working directory:填入$ProjectFileDir$,表示文件所在的項(xiàng)目路徑
4:配置轉(zhuǎn)化工具pyuic

Name:自己起的名字
Program:python.exe所在的位置,一般在Python\Python38-32\python.exe這里
Arguements:填入-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
是將.ui文件轉(zhuǎn)化成.py文件的語(yǔ)句。
2.qt designer 布局的使用。
1:打開(kāi)這個(gè)設(shè)計(jì)師

2:創(chuàng)建一個(gè)窗口

?3:設(shè)計(jì)界面,用鼠標(biāo)拖動(dòng)左邊的控件。

界面設(shè)計(jì)完成后點(diǎn)左上角的保存就可以,因?yàn)槲疫@個(gè)就是一個(gè)簡(jiǎn)單的界面我就沒(méi)有設(shè)置布局之類的,如果有強(qiáng)迫癥的小伙伴可以去設(shè)置布局哦,在csdn中都有資料的哦。
4:ui轉(zhuǎn)化為py

qrcTopy這個(gè)我說(shuō)一下,因?yàn)檫@個(gè)gui界面沒(méi)有用到圖片就沒(méi)有qrc轉(zhuǎn)化py,qrc這個(gè)就是把圖片py文件才能在使用ui轉(zhuǎn)化的py,否則就不可以顯示你在qtdesigners 上面設(shè)計(jì)的圖片。
5:在python上面運(yùn)行轉(zhuǎn)化后的py文件

一般轉(zhuǎn)化過(guò)來(lái)的py文件里面,類都是沒(méi)有初始化的,這個(gè)后面有一個(gè)坑,就是文件窗口調(diào)用的時(shí)候,你得初始化繼承qt中的類才能繼續(xù)使用文件窗口那個(gè)功能,小伙伴如果有什么不理解,可以等會(huì)看完整的代碼就明白了。
if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
6:我們現(xiàn)在運(yùn)行py文件就可以看見(jiàn)下面這個(gè)GUI界面,所以第一步算是完成了。

3.百度智能云api的調(diào)用。
接下來(lái)我們來(lái)調(diào)用百度智能云的api? 。
1.首先我們先打開(kāi)?百度智能云。
2.
?然后我們找到這個(gè)圖像特效

?我么可以查看這個(gè)調(diào)用方法,然后去獲取免費(fèi)的調(diào)用機(jī)會(huì)。

主要是獲取到這個(gè)AK 和SK,調(diào)用的時(shí)候需要用到這個(gè)東西。如果吊用還不是很懂的話,可以仔細(xì)看看官方的調(diào)用文檔,接下來(lái)話不多說(shuō),直接上代碼。
import requests, base64
# 這個(gè)函數(shù)的操作是為了獲取access_token參數(shù)
def get_access_token():
url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[AK]&client_secret=[SK]'
res = requests.post(url)
res = res.json()
# print(res)
access_token = res['access_token']
return access_token
def img2Cartoon(path):
request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime"
# 二進(jìn)制方式打開(kāi)圖片文件
f = open(path, 'rb')
img1 = base64.b64encode(f.read())
params = {"image":img1}
access_token = get_access_token()
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
print(response.json())
# 對(duì)響應(yīng)結(jié)果進(jìn)行處理
if response:
# 打開(kāi)一個(gè)文件
f = open(path, 'wb')
# 獲取動(dòng)漫頭像
anime = response.json()['image']
# 對(duì)返回的頭像進(jìn)行解碼
anime = base64.b64decode(anime)
# 將頭像寫入文件當(dāng)中
f.write(anime)
f.close()
if __name__ == '__main__':
img2Cartoon()
?調(diào)用成功后,我們的這個(gè)第二步就成功了。
4.調(diào)控界面的控件。
接下來(lái)我們來(lái)給界面的布局建立信號(hào)和槽
1.界面一共有三個(gè)標(biāo)簽,兩個(gè)按鍵,一個(gè)輸入表格。

?查看圖片我們是直接打開(kāi)窗口選擇文件然后在輸入表格上面顯示,就是文件窗口我們?nèi)绻褂玫脑?,我們得給類初始化,并繼承qt中的類,才能正常使用其中的qt調(diào)用窗口函數(shù)。
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(Ui_MainWindow, self).__init__()
然后我們分別給按鍵調(diào)用函數(shù)功能。
self.pushButton.clicked.connect(self.xians)
self.pushButton_2.clicked.connect(self.zh)
可能還有一些小伙伴沒(méi)有看明白,我們直接上源碼吧
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'six.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
import os,sys
from PyQt5.QtWidgets import *
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(Ui_MainWindow, self).__init__()
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1062, 652)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(40, 10, 471, 451))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(570, 10, 431, 451))
self.label_2.setObjectName("label_2")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(150, 530, 151, 41))
self.pushButton.setStyleSheet("font: 16pt \"仿宋\";")
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(740, 530, 151, 41))
self.pushButton_2.setStyleSheet("font: 16pt \"仿宋\";")
self.pushButton_2.setObjectName("pushButton_2")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(350, 200, 110, 17))
self.widget.setObjectName("widget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.widget1 = QtWidgets.QWidget(self.centralwidget)
self.widget1.setGeometry(QtCore.QRect(340, 490, 371, 41))
self.widget1.setObjectName("widget1")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_3 = QtWidgets.QLabel(self.widget1)
self.label_3.setStyleSheet("font: 12pt \"隸書\";")
self.label_3.setObjectName("label_3")
self.horizontalLayout_2.addWidget(self.label_3)
self.lineEdit = QtWidgets.QLineEdit(self.widget1)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout_2.addWidget(self.lineEdit)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1062, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "漫畫臉生成"))
self.label.setText(_translate("MainWindow", "原圖"))
self.label_2.setText(_translate("MainWindow", "漫畫臉"))
self.pushButton.setText(_translate("MainWindow", "查看原圖:"))
self.pushButton_2.setText(_translate("MainWindow", "生成漫畫臉"))
self.label_3.setText(_translate("MainWindow", "圖片地址:"))
self.pushButton.clicked.connect(self.xians)
self.pushButton_2.clicked.connect(self.zh)
def xians(self):
self.cwd = os.getcwd()
print(type(self.cwd))
fileName_choose = QFileDialog.getOpenFileName(self, "文件打開(kāi)",
# 起始路徑
self.cwd,
"All Files (*);;Text Files (*.txt)") # 設(shè)置文件擴(kuò)展名過(guò)濾,用雙分號(hào)間隔
if fileName_choose[0] == "":
print("\n取消選擇")
return
self.lineEdit.setText(fileName_choose[0])
if os.path.isfile(self.lineEdit.text()) == True:
png = QtGui.QPixmap(self.lineEdit.text())
self.label.setPixmap(png)
self.label.setScaledContents(True)
else:
self.messageDialog()
pass
def messageDialog(self):
mag_box = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, '警告', '文件異常!')
mag_box.exec_()
def zh(self):
import apics #這個(gè)就是調(diào)用api接口那個(gè)函數(shù)
path = self.lineEdit.text()
path = path.replace('\\', '\\\\')
apics.img2Cartoon(path)
png = QtGui.QPixmap(self.lineEdit.text())
self.label_2.setPixmap(png)
self.label_2.setScaledContents(True)
pass
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
5.最終成果

6.總結(jié)
到此這篇關(guān)于python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python完成SAP客戶端的打開(kāi)和系統(tǒng)登陸功能
這篇文章主要介紹了使用Python完成SAP客戶端的打開(kāi)和系統(tǒng)登陸,涉及到SAP的打開(kāi)和登錄過(guò)程,本文重點(diǎn)介紹如何通過(guò)Python完成SAP應(yīng)用程序的打開(kāi)并進(jìn)入特定的”用戶指定系統(tǒng)“,需要的朋友可以參考下2022-05-05
Python 利用郵件系統(tǒng)完成遠(yuǎn)程控制電腦的實(shí)現(xiàn)(關(guān)機(jī)、重啟等)
這篇文章主要介紹了Python 利用郵件系統(tǒng)完成遠(yuǎn)程控制電腦(關(guān)機(jī)、重啟等),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
解析pandas apply() 函數(shù)用法(推薦)
這篇文章主要介紹了pandas apply() 函數(shù)用法,大家需要掌握函數(shù)作為一個(gè)對(duì)象,能作為參數(shù)傳遞給其它函數(shù),也能作為函數(shù)的返回值,具體內(nèi)容詳情跟隨小編一起看看吧2021-10-10
對(duì)Python協(xié)程之異步同步的區(qū)別詳解
今天小編就為大家分享一篇對(duì)Python協(xié)程之異步同步的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Python實(shí)現(xiàn)統(tǒng)計(jì)單詞出現(xiàn)的個(gè)數(shù)
這篇文章主要介紹了Python實(shí)現(xiàn)統(tǒng)計(jì)單詞出現(xiàn)的個(gè)數(shù),本文給出了實(shí)現(xiàn)代碼以及使用方法,需要的朋友可以參考下2015-05-05
利用Python多處理庫(kù)處理3D數(shù)據(jù)詳解
本文將介紹處理大量數(shù)據(jù)時(shí)非常方便的工具,例如tqdm與 multiprocessing?imap??一起使用、并行處理檔案、繪制和處理3D數(shù)據(jù)等,感興趣的小伙伴可以了解一下2021-12-12
用Python中的__slots__緩存資源以節(jié)省內(nèi)存開(kāi)銷的方法
這篇文章主要介紹了用Python中的__slots__通過(guò)緩存資源的方式以節(jié)省內(nèi)存開(kāi)銷的方法,且示例代碼非常簡(jiǎn)單,需要的朋友可以參考下2015-04-04
python中數(shù)據(jù)爬蟲requests庫(kù)使用方法詳解
本篇文章主要介紹了python中數(shù)據(jù)爬蟲requests庫(kù)使用方法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Python利用pangu模塊實(shí)現(xiàn)文本格式化小工具
其實(shí)使用pangu做文本格式標(biāo)準(zhǔn)化的業(yè)務(wù)代碼在之前就實(shí)現(xiàn)了,主要能夠?qū)⒅形奈谋疚臋n中的文字、標(biāo)點(diǎn)符號(hào)等進(jìn)行標(biāo)準(zhǔn)化。但是為了方便起來(lái)我們這里使用了Qt5將其做成了一個(gè)可以操作的頁(yè)面應(yīng)用,需要的可以了解一下2022-10-10

