第一部分

          jacky 的一貫理念,學(xué)東西不要學(xué)表面,而要學(xué)本質(zhì)。技術(shù)之上,永遠(yuǎn)都是哲學(xué)。

          本文的視頻演示如下:

          https://v.qq.com/x/page/v0890lmkjfo.html
          <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fv.qq.com%2Fx%2Fpage%2Fv0890lmkjfo.html>

          (一)PyQt5 的演變史

          要說清楚 PyQt5 是什么,我們要先簡要說說 Qt 是什么

          1. Qt 是什么

          先抽象的說 Qt 是什么?

          * Qt 是跨平臺(tái) C++ 圖形用戶界面應(yīng)用程序開發(fā)框架,Qt
          可以同時(shí)支持桌面應(yīng)用程序開發(fā)、嵌入式開發(fā)和移動(dòng)開發(fā),覆蓋了現(xiàn)在所有的主流平臺(tái)。1991年由挪威奇趣科技開發(fā);這個(gè)挪威的奇趣科技,jacky
          再多說幾句,這家公司還有很多著名的產(chǎn)品,比如說 Linux 操作系統(tǒng)上最流行的桌面環(huán)境之一 KDE,有 Autodesk Maya , 有 WPS , 有
          YY 語音,有 VirtualBox ,有 Opera 瀏覽器,極品飛車,暴雪戰(zhàn)網(wǎng)客戶端等等,總之很牛X。
          * 還有 Qt 的開發(fā)宗旨,jacky 是比較喜歡的:"Code Less; Create More; Deploy Anywhere"
          2. QT Designer 是什么?

          程序員制作程序 UI 界面,一般會(huì)有2種方法,利用 UI 制作工具和純代碼編寫,像移動(dòng)開發(fā)中的 Android 和 iOS 都是這樣,在
          PyQt5中,我們也有這么2種方式。

          * QtDesinger 是專門用來制作 Qt 程序 UI
          界面的工具,它使用起來非常簡單,只要通過拖拽和點(diǎn)擊就可以完成復(fù)雜的界面設(shè)計(jì),而且還可以隨時(shí)預(yù)覽查看效果圖。
          3. PyQt5 是什么?

          * PyQt 是一個(gè)用于創(chuàng)建 GUI 應(yīng)用程序的跨平臺(tái)工具包,它將 Python 與 Qt 庫融為一體。也就是說,PyQt 允許使用Python語言調(diào)用
          Qt 庫中的 API 。這樣做的最大好處就是在保留了 Qt 高運(yùn)行效率的同時(shí),大大提高了開發(fā)效率。因?yàn)?,使?Python 語言開發(fā)程序要比使用 C++
          語言開發(fā)程序快得多。 PyQt 對(duì) Qt 做了完整的封裝,幾乎可以用 PyQt做 Qt 能做的任何事情。
          * 由于目前最新的 PyQt 版本是5.11,所以習(xí)慣上成為 PyQt 為 PyQt5 。
          *
          下面解釋一個(gè)問題就是:是用 PyQt好,還是 QT 好???

          * 其實(shí)關(guān)注這個(gè)問題的朋友可能是真的想知道答案,但是這個(gè)問題其實(shí)是個(gè)偽命題。與其說是 PyQT 好還是 QT 好,倒不如說你更熟悉于 C++ 開始還是
          Python 開發(fā)。熟悉 C++ 就用 QT ,熟悉 Python 就用 PyQt。
          (二)PyQt5 桌面 GUI 開發(fā)

          本部分 jacky 偷個(gè)懶,轉(zhuǎn)載一位網(wǎng)友的文章,我覺得很不錯(cuò),分享給大家

          http://blog.sina.com.cn/s/blog_989218ad0102wz1k.html
          <https://yq.aliyun.com/go/articleRenderRedirect?url=http%3A%2F%2Fblog.sina.com.cn%2Fs%2Fblog_989218ad0102wz1k.html>

          先看效果:

          沒錯(cuò),學(xué)過C#的同學(xué)應(yīng)該很熟悉這個(gè)界面,按鈕風(fēng)格和界面風(fēng)格很相似,萬萬沒想到,python也可以做出這樣的界面。

          2.1 安裝python

          為啥要說這個(gè),我們打開pip,搜索:PyQt5,或者直接打開下面的連接:

          https://pypi.python.org/pypi/PyQt5/5.9.1
          <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fpypi.python.org%2Fpypi%2FPyQt5%2F5.9.1>

          可以看到,PyQt5所支持的python版本是從3.5開始的,這點(diǎn)很重要。

          找一個(gè)python3.5以上的版本安裝:

          https://www.python.org/downloads/windows/
          <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.python.org%2Fdownloads%2Fwindows%2F>

          2.2 安裝PyQt5

          推薦使用pip安裝:

          pip3 install PyQt5

          等待片刻,繼續(xù)安裝PyQt5-tools

          pip install PyQt5-tools

          2.3 配置pycharm

          官網(wǎng)下載安裝pycharm:https://www.jetbrains.com/pycharm/
          <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.jetbrains.com%2Fpycharm%2F>

          1、點(diǎn)擊:File -》Settings


          2、Tools -》 External Tools -》點(diǎn)擊“+”號(hào)
          (ps:下面是我配置好的,你的軟件還沒有很正常,繼續(xù)往下看)

          3、設(shè)置Qt Designer
          修改三個(gè)地方,其他地方默認(rèn):

          Name:Qt Designer
          Programs:D:Program FilesPython35Libsite-packagespyqt5-toolsdesigner.exe
          Working directory:$ ProjectFileDir$

          (ps:Programs參數(shù)需要修改為你電腦里邊的“designer.exe”路徑)



          4、配置PyUIC
          設(shè)置四個(gè)地方,其他可以默認(rèn)(我也不知道怎么改,那就默認(rèn)吧)

          Name:PyUIC
          Programs:D:Program FilesPython35python.exe
          Parameters:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
          Working directory:$ ProjectFileDir$

          (ps:Programs參數(shù)需要修改為你電腦里邊的python“python.exe”路徑)



          2.4 使用Qt Designer

          1、完成以上步驟之后,點(diǎn)擊 Tools -》External Tools -》Qt Designer 啟動(dòng)我們的Qt Designer

          2、啟動(dòng)后選擇:Widget,建立空白的窗口,點(diǎn)擊 Create,其他默認(rèn)就行


          3、從左邊 1區(qū) 拖拽,注意是“拖拽”控件到 2區(qū),在 3區(qū) 中修改對(duì)應(yīng)屬性,很像vs有木有



          4、昨晚基本的界面設(shè)置之后,會(huì)看到同目錄下生成了一個(gè)“.ui”的文件


          5、右鍵 External Tools -》PyUIC ,將“.ui”文件轉(zhuǎn)為“.py”文件


          6、這時(shí),如果一切正常,沒有報(bào)錯(cuò)的話,會(huì)在同目錄下生成對(duì)應(yīng)的“.py”文件


          7、將下面的代碼,放到生成的“.py”文件,放到最后就行(注意縮進(jìn))
          if __name__=="__main__": import sys from PyQt5.QtGui import QIcon
          app=QtWidgets.QApplication(sys.argv) widget=QtWidgets.QWidget() ui=Ui_Form()
          ui.setupUi(widget) widget.setWindowIcon(QIcon('web.png'))#增加icon圖標(biāo),如果沒有圖片可以沒有這句
          widget.show() sys.exit(app.exec_())
          8、運(yùn)行啟動(dòng),好了,恭喜你,開啟了pythonGUI



          (三)一個(gè)登陸系統(tǒng)的實(shí)現(xiàn)

          3.1 前面的補(bǔ)充

          * 對(duì)于上面我轉(zhuǎn)載網(wǎng)友的內(nèi)容,jacky 這里補(bǔ)充幾點(diǎn):
          * 我們下載 PyQt5 的時(shí)候,建議使用豆瓣源(什么是豆瓣源可以看我之前的文章) pip install -i
          https://pypi.douban.com/simple/ PyQt5 pip install -i
          https://pypi.douban.com/simple/ PyQt5-tools
          * 關(guān)于進(jìn)階學(xué)習(xí)我們還可以看以下資料
          《PyQt5 教程》 http://code.py40.com/pyqt5/
          <https://yq.aliyun.com/go/articleRenderRedirect?url=http%3A%2F%2Fcode.py40.com%2Fpyqt5%2F>

          3.2 Python 智能銀行卡識(shí)別系統(tǒng)實(shí)現(xiàn)-登陸功能

          * 完整代碼 # -*- coding: utf-8 -*- # Form implementation generated from reading
          ui file 'login.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING!
          All changes made in this file will be lost! from PyQt5 import QtCore, QtGui,
          QtWidgets class Ui_Form(object): def setupUi(self, Form):
          Form.setObjectName("Form") Form.resize(380, 245) self.widget =
          QtWidgets.QWidget(Form) self.widget.setGeometry(QtCore.QRect(50, 30, 291, 165))
          self.widget.setObjectName("widget") self.verticalLayout =
          QtWidgets.QVBoxLayout(self.widget) self.verticalLayout.setContentsMargins(0, 0,
          0, 0) self.verticalLayout.setObjectName("verticalLayout") self.label =
          QtWidgets.QLabel(self.widget) self.label.setObjectName("label")
          self.verticalLayout.addWidget(self.label) self.lineEdit =
          QtWidgets.QLineEdit(self.widget) self.lineEdit.setObjectName("lineEdit")
          self.verticalLayout.addWidget(self.lineEdit) self.label_2 =
          QtWidgets.QLabel(self.widget) self.label_2.setObjectName("label_2")
          self.verticalLayout.addWidget(self.label_2) self.lineEdit_2 =
          QtWidgets.QLineEdit(self.widget) self.lineEdit_2.setObjectName("lineEdit_2")
          self.verticalLayout.addWidget(self.lineEdit_2) self.pushButton =
          QtWidgets.QPushButton(self.widget) self.pushButton.setObjectName("pushButton")
          self.verticalLayout.addWidget(self.pushButton) self.pushButton_2 =
          QtWidgets.QPushButton(self.widget)
          self.pushButton_2.setObjectName("pushButton_2")
          self.verticalLayout.addWidget(self.pushButton_2) self.retranslateUi(Form)
          QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form):
          _translate = QtCore.QCoreApplication.translate
          Form.setWindowTitle(_translate("Form", "智能銀行卡識(shí)別系統(tǒng) v1.0 login"))
          self.label.setText(_translate("Form", "用戶名:"))
          self.label_2.setText(_translate("Form", "密碼:"))
          self.pushButton.setText(_translate("Form", "登錄"))
          self.pushButton_2.setText(_translate("Form", "退出")) # 登錄按鈕
          self.pushButton.clicked.connect(self.onclick) #退出按鈕
          self.pushButton_2.clicked.connect(quit) def onclick(self): if
          self.lineEdit.text() == 'jacky': if self.lineEdit_2.text() == '666666':
          MainWindow.close(widget) else: self.lineEdit_2.setText('密碼錯(cuò)誤請(qǐng)重新輸入') else:
          self.lineEdit.setText('用戶錯(cuò)誤請(qǐng)重新輸入') if __name__=="__main__": import sys from
          PyQt5.QtGui import QIcon app=QtWidgets.QApplication(sys.argv)
          MainWindow=QtWidgets.QMainWindow widget=QtWidgets.QWidget() ui=Ui_Form()
          ui.setupUi(widget)
          #widget.setWindowIcon(QIcon('web.png'))#增加icon圖標(biāo),如果沒有圖片可以沒有這句 widget.show()
          sys.exit(app.exec_())
          第二部分


          本文適合于所有層次的Python學(xué)習(xí)者,包括AI愛好者和技術(shù)愛好者來學(xué)習(xí)。誠然,人工智能是個(gè)有著深刻數(shù)學(xué)邏輯的知識(shí)體系,包括機(jī)器學(xué)習(xí),搜索問題,知識(shí)表示等等等等的理論。本文,嚴(yán)禁的說,我們只是簡單調(diào)用了百度AI的成果,jacky通過本文希望給大家一個(gè)啟發(fā)吧,畢竟理論是理論,實(shí)際是實(shí)際,賺錢是賺錢,就這樣。

          本文視頻演示如下(由于環(huán)境因素的限制,這段演示視頻是無聲的,后期jacky 在Gitchat ,阿里云以及抖音都會(huì)有直播的分享,請(qǐng)大家關(guān)注):
          視頻演示鏈接
          <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fv.qq.com%2Fx%2Fpage%2Fg0901iwrkde.html>

          (一)先看看系統(tǒng)的效果





          (二)系統(tǒng)實(shí)現(xiàn)的大致思路

          本文的視頻演示如下:

          系統(tǒng)開發(fā)環(huán)境要求:
          1.開發(fā)工具:Pycharm 、PyQt5
          2.開發(fā)模塊: urllib、urllib.request、Base64、json、PyQt5
          3.API 接口:百度API

          2.1 圖片識(shí)別工具界面

          *
          PyQt5 桌面 GUI 開發(fā)

          * 這部分,是 jacky 上次主要的分享內(nèi)容,不是很熟悉的朋友可以參見《Python 智能銀行卡識(shí)別系統(tǒng)的實(shí)現(xiàn) (1)— PyQt5
          實(shí)現(xiàn)登陸功能》,也可以配合本次視頻前面的操作演示來看。
          2.2 選擇識(shí)別類型

          * 我們要設(shè)定識(shí)別的銀行卡,信用卡還是身份證等等
          2.3 選擇要識(shí)別的圖片

          *
          這里的主要難點(diǎn)就是要搞懂這句代碼:self.label_3.setPixmap(scarePixmap),具體的代碼注解可以參見第三部分的完整代碼,其他的技巧點(diǎn)都是Qt
          里東西,關(guān)于QPixmap的用法等等,因?yàn)椴皇沁壿嬓缘臇|西,大家可以自行百度。
          2.4 識(shí)別結(jié)果

          * 這里用到的就是百度的AI 接口,

          2.5 復(fù)制到粘貼板

          * 這是PyQt5 的一些小功能,我們自行百度即可。
          (三)完整代碼
          # -*- coding: utf-8 -*- # Form implementation generated from reading ui file
          'ocr.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All
          changes made in this file will be lost! # 原創(chuàng):朱元祿(jacky)首發(fā):數(shù)據(jù)分析部落(datashuju)
          from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from
          PyQt5.QtGui import * from PyQt5.QtCore import * import json # 我們是Python3
          ,在調(diào)用百度AI token 的時(shí)候不用官方文檔中的urllib2,替換成 urllib.request import urllib,
          urllib.request, sys import ssl import base64 # 這里輸入自己獲取的AK以及SK API_KEY =
          "jacky提醒你,這里要輸入你自己申請(qǐng)的AK,不要忘記" SECRET_KEY = "jacky提醒你,這里要輸入你自己申請(qǐng)的AK,不要忘記" class
          Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form")
          Form.resize(793, 452) self.widget = QtWidgets.QWidget(Form)
          self.widget.setGeometry(QtCore.QRect(80, 41, 631, 371))
          self.widget.setObjectName("widget") self.gridLayout =
          QtWidgets.QGridLayout(self.widget) self.gridLayout.setContentsMargins(0, 0, 0,
          0) self.gridLayout.setObjectName("gridLayout") self.pushButton =
          QtWidgets.QPushButton(self.widget) self.pushButton.setObjectName("pushButton")
          self.gridLayout.addWidget(self.pushButton, 2, 2, 1, 1) self.lineEdit =
          QtWidgets.QLineEdit(self.widget) self.lineEdit.setObjectName("lineEdit")
          self.gridLayout.addWidget(self.lineEdit, 2, 1, 1, 1) self.label_2 =
          QtWidgets.QLabel(self.widget) self.label_2.setObjectName("label_2")
          self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) self.label_3 =
          QtWidgets.QLabel(self.widget) self.label_3.setObjectName("label_3")
          self.label_3.setStyleSheet("background-color:gray")
          self.gridLayout.setObjectName("label_3")
          self.gridLayout.addWidget(self.label_3, 3, 0, 1, 3) self.lineEdit_2 =
          QtWidgets.QLineEdit(self.widget) self.lineEdit_2.setObjectName("lineEdit_2")
          self.gridLayout.addWidget(self.lineEdit_2, 7, 0, 1, 2) self.pushButton_2 =
          QtWidgets.QPushButton(self.widget)
          self.pushButton_2.setObjectName("pushButton_2")
          self.gridLayout.addWidget(self.pushButton_2, 7, 2, 1, 1) self.label =
          QtWidgets.QLabel(self.widget) self.label.setObjectName("label")
          self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.comboBox =
          QtWidgets.QComboBox(self.widget) self.comboBox.setObjectName("comboBox")
          self.comboBox.addItem("") self.gridLayout.addWidget(self.comboBox, 0, 1, 1, 1)
          self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def
          retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate
          Form.setWindowTitle(_translate("Form", "智能銀行卡識(shí)別系統(tǒng)_v1.0"))
          self.pushButton.setText(_translate("Form", "選擇"))
          self.label_2.setText(_translate("Form", "選擇要識(shí)別的圖片"))
          self.label_3.setText(_translate("Form", ""))
          self.lineEdit_2.setText(_translate("Form", "顯示識(shí)別結(jié)果"))
          self.pushButton_2.setText(_translate("Form", "復(fù)制"))
          self.label.setText(_translate("Form", "需要識(shí)別的類型:")) self.comboBox.setItemText(0,
          _translate("Form", "銀行卡")) self.comboBox.setItemText(1, _translate("Form",
          "身份證")) self.comboBox.setItemText(2, _translate("Form", "車牌號(hào)")) #
          第一步,我們要讓系統(tǒng)可以點(diǎn)擊選擇來獲取我們要上傳的圖片 self.pushButton.clicked.connect(self.openfile) #
          第二步,設(shè)置選擇圖片的路徑 def openfile(self): self.download_path =
          QFileDialog.getOpenFileName(self.widget,"請(qǐng)選擇需要識(shí)別的圖片","/","Image File(*.jpg
          *.png)") # 判斷是否選擇了圖片 if not self.download_path[0].strip(): pass else:
          self.lineEdit.setText(self.download_path[0]) # 自動(dòng)解析圖像 pixmap =
          QPixmap(self.download_path[0]) # 選擇圖片,圖片可能有大有小,我們簡單的處理一下圖片 scarePixmap =
          pixmap.scaled(QSize(629,271),aspectRatioMode=Qt.KeepAspectRatio) # 把圖片設(shè)置到我們的控件里
          self.label_3.setPixmap(scarePixmap) self.typeTp() # 第三步:選擇類型 def typeTp(self):
          if self.comboBox.currentIndex()==0: self.get_token()
          self.get_bankcard(self.get_token()) def get_token(self): # client_id 為官網(wǎng)獲取的AK,
          client_secret 為官網(wǎng)獲取的SK host =
          'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+API_KEY+'&client_secret='+SECRET_KEY
          request = urllib.request.Request(host) request.add_header('Content-Type',
          'application/json; charset=UTF-8') response = urllib.request.urlopen(request)
          content = response.read() if (content): print(content) # 解釋返回的 token 數(shù)據(jù)
          self.access_token = json.loads(content)['access_token'] return
          self.access_token def get_bankcard(self,access_token): url =
          'https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard?access_token=' +
          access_token f = open(self.download_path[0], 'rb') # 二進(jìn)制方式打開圖文件 img =
          base64.b64encode(f.read()) params = {"image": img} # 百度AI給的示例是Python2 # params
          = urllib.urlencode(params) params =
          urllib.parse.urlencode(params).encode('utf-8') request =
          urllib.request.Request(url, params) request.add_header('Content-Type',
          'application/x-www-form-urlencoded') response = urllib.request.urlopen(request)
          content = response.read() if (content): print(content) bankcards =
          json.loads(content) stover = '識(shí)別結(jié)果:\n' try: if
          bankcards['result']['bank_card_type'] == 0: bank_card_type = "不能識(shí)別" elif
          bankcards['result']['bank_card_type'] == 1: bank_card_type = "借記卡" elif
          bankcards['result']['bank_card_type'] == 2: bank_card_type = "信用卡" stover +=
          '卡號(hào): {}\n 銀行:{}\n
          類型:{}'.format(bankcards['result']['bank_card_number'],bankcards['result']['bank_name'],bank_card_type)
          except BaseException: stover += '解析錯(cuò)誤' self.lineEdit_2.setText(stover) if
          __name__ == "__main__": import sys from PyQt5.QtGui import QIcon app =
          QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow widget =
          QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(widget) #
          widget.setWindowIcon(QIcon('web.png'))#增加icon圖標(biāo),如果沒有圖片可以沒有這句 widget.show()
          sys.exit(app.exec_())

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                国产精品久久久久桃色tv | 黄色一级电视剧 | xxxx性洗澡xxxxⅹ | 黄色AV免费 | 免费看特别黄色视频 |