Python大數(shù)據(jù)分析與挖掘?qū)崙?zhàn)-第12章-圖形用戶界面可視化應(yīng)用開發(fā)_第1頁
Python大數(shù)據(jù)分析與挖掘?qū)崙?zhàn)-第12章-圖形用戶界面可視化應(yīng)用開發(fā)_第2頁
Python大數(shù)據(jù)分析與挖掘?qū)崙?zhàn)-第12章-圖形用戶界面可視化應(yīng)用開發(fā)_第3頁
Python大數(shù)據(jù)分析與挖掘?qū)崙?zhàn)-第12章-圖形用戶界面可視化應(yīng)用開發(fā)_第4頁
Python大數(shù)據(jù)分析與挖掘?qū)崙?zhàn)-第12章-圖形用戶界面可視化應(yīng)用開發(fā)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第十二章GUI可視化應(yīng)用開發(fā)提高篇

前面章節(jié)介紹了Python大數(shù)據(jù)分析與挖掘技術(shù)在金融、地理信息、交通、文本、圖像等領(lǐng)域的具體應(yīng)用,但是我們注意到這些案例均是在Python開發(fā)環(huán)境下利用腳本程序運行的,然而實際環(huán)境中可視化應(yīng)用開發(fā)必不可少??梢暬瘧?yīng)用開發(fā)一般有兩種方式,一種是基于web的網(wǎng)站交互可視化,一種是基于桌面應(yīng)用軟件的交互可視化。由于Python大數(shù)據(jù)應(yīng)用涉及大量的復(fù)雜計算,同時考慮到本課程的特點,我們采用純Python的桌面應(yīng)用軟件開發(fā),即圖形用戶界面(GUI)可視化應(yīng)用開發(fā)。本章以應(yīng)用為導(dǎo)向,以兩個具體案例為準線,介紹GUI可視化應(yīng)用開發(fā)的環(huán)境安裝及配置、界面設(shè)計、程序邏輯編寫、生產(chǎn)EXE等基本知識。12.1水色圖像水質(zhì)評價系統(tǒng)Part12

本節(jié)以第11章中基于支持向量機的水色圖像分類識別模型及程序?qū)崿F(xiàn)邏輯為基礎(chǔ),設(shè)計一個簡單的GUI可視化應(yīng)用界面,其實現(xiàn)界面如圖12-1所示。圖12-1單擊“導(dǎo)入圖片”按鈕,彈出一個文件選擇框,選擇某個水色圖像后,該圖像即顯示在TextLabel框中,單擊“水色識別”按鈕,對應(yīng)的水色類別值即顯示在空白的文本編輯框中。下面詳細介紹其實現(xiàn)及生產(chǎn)EXE方法。12.1.1Pycharm的安裝Part12

Pycharm是Python的主流項目開發(fā)工具,本章選用社區(qū)版,版本為2019.3.3,其安裝包可以從官網(wǎng)上下載,如圖12-2所示。圖12-212.1.1Pycharm的安裝Part

12下載完成之后,獲得其安裝包,如圖12-3所示。圖12-3

雙擊“Pycharem-community-2019.3.3”安裝包,進入安裝向?qū)В凑漳J設(shè)置安裝即可。如圖12-4所示,進入了Pycharm安裝向?qū)Ы缑?。圖12-412.1.1Pycharm的安裝Part

12

單擊“next”按鈕,進入下一步安裝向?qū)?,選擇默認安裝路徑、默認啟動文件夾(JetBrains)并單擊“install”按鈕,進入安裝進度界面,等待安裝結(jié)束即可,安裝結(jié)束界面如圖12-5所示。圖12-512.1.2創(chuàng)建項目文件夾Part

12

在“開始”菜單中打開“JetBrains”文件夾,單擊“PycharmCommunityEdition2019.3.3”按鈕,啟動Pycharm,如圖12-6所示。圖12-6由于是第一次啟動pycharm,按照默認的設(shè)置即可,如圖12-7所示。我們可以不暫時不導(dǎo)入設(shè)置項。單擊“OK”按鈕,進入用戶設(shè)置界面,我們第一次使用pycharm進行項目開發(fā),選擇默認的設(shè)置即可,如圖12-8所示。圖12-712.1.2創(chuàng)建項目文件夾Part

12

單擊“SkipRemainingandSetDefaults”按鈕,進入項目創(chuàng)建界面。這里我們創(chuàng)建一個新項目,如圖12-9所示。圖12-812.1.2創(chuàng)建項目文件夾Part

12單擊“CreateNewProject”按鈕,在彈出的界面中輸入項目的文件夾路徑,可以是存在的文件夾,如果不存在則創(chuàng)建一個新的文件夾。如圖12-10所示。圖12-912.1.2創(chuàng)建項目文件夾Part

12

單擊“Create”按鈕,即可彈出在該項目文件夾下的pycharm開發(fā)環(huán)境,包括產(chǎn)生一些默認的文件,如圖12-11所示。圖12-1012.1.2創(chuàng)建項目文件夾Part

12圖12-1112.1.3配置QtDesigner工具Part

12

本節(jié)主要介紹如何在pycharm中配置Anaconda(python3.6)下的界面設(shè)計師(Designer),從而快速完成PyQt界面的設(shè)計。首先打開“Settings”選項,如圖12-12所示。圖12-1212.1.3配置QtDesigner工具Part

12

在打開的設(shè)置窗口中選擇“Tools/ExternalTools”選項,單擊添加“+”按鈕,即可彈出外部工具配置窗口,如圖12-13所示。圖12-1312.1.3配置QtDesigner工具Part

12

在彈出的外部工具配置窗口中,輸入外部工具名稱,這里用QtDesigner表示,接著輸入Anaconda安裝環(huán)境中的PyQt界面設(shè)計師可執(zhí)行文件完整路徑以及工作路徑配置參數(shù),如圖12-14所示。圖12-14單擊“ok”按鈕,即可完成QtDesigner外部工具的配置。如圖12-15所示,“Tools/ExternalTools”欄中增加了QtDesigner。12.1.3配置QtDesigner工具Part

12圖12-1512.1.4配置代碼生成工具Part

12

與上一節(jié)中配置QtDesigner外部工具操作一致,在“Tools/ExternalTools”中繼續(xù)單擊添加“+”按鈕,命名為PyUCI,其應(yīng)用程序、輸入?yún)?shù)和工具路徑的設(shè)置如圖12-16所示。圖12-16

單擊“ok”按鈕后,在“Tools/ExternalTools”欄中又增加了一個選項PyUCI,如圖12-17所示。再次單擊“ok”按鈕,Pycharm開發(fā)環(huán)境中就增加了兩個外部工具QtDesigner和PyUCI,在以后的項目開發(fā)中無需再對這兩個外部工具進行配置了。12.1.4配置代碼生成工具Part

12圖12-1712.1.5系統(tǒng)界面設(shè)計Part

12在項目文件夾的Pycharm開發(fā)環(huán)境中,打開前面配置的外部工具QtDesigner,如圖12-18所示。圖12-18單擊外部工具QtDesigner,即可彈出界面設(shè)計師軟件窗口,在該窗口下即可設(shè)計水色圖像水質(zhì)評價系統(tǒng)的界面,如圖12-19所示。12.1.5系統(tǒng)界面設(shè)計Part

12圖12-19

注意這里使用的是主窗體創(chuàng)建系統(tǒng)界面,如圖12-19中的高亮部分,單擊“創(chuàng)建”按鈕即彈出主窗體,主窗體命名為“水色圖像水質(zhì)評價系統(tǒng)”,接著從左邊的控件欄目中拖拽兩個“pushButton”按鈕,分別命名為“導(dǎo)入圖片”、“水色識別”,拖拽一個“textEdit”用于顯示水色類別,拖拽兩個“l(fā)abel”,一個用于表示水色“類別”,一個用于顯示導(dǎo)入的水色圖像,如圖12-20所示。12.1.5系統(tǒng)界面設(shè)計Part

12圖12-20單擊保存圖標,即可保存設(shè)計的界面,其文件名與創(chuàng)建的項目文件夾名稱相同,文件名后綴為.ui,默認情況下保存在項目文件下。如圖12-21所示。12.1.5系統(tǒng)界面設(shè)計Part

12圖12-21

至此界面設(shè)計就完成了,而且該界面的ui文件已經(jīng)生成并保存在項目文件夾下,這時可以切換至Pycharm環(huán)境下,我們可以看到mygui.ui這個文件,它就是界面設(shè)計文件。如圖12-22所示。12.1.5系統(tǒng)界面設(shè)計Part

12圖12-2212.1.6系統(tǒng)界面轉(zhuǎn)化為PyQt5代碼Part

12

通過QtDesigner界面設(shè)計師工具,可以快速地設(shè)計GUI界面,從而能夠提高開發(fā)效率以及降低開發(fā)的難度。然而,完成系統(tǒng)開發(fā)最終需要將ui界面轉(zhuǎn)化為Python程序代碼,從而實現(xiàn)程序邏輯編程及完成相關(guān)功能開發(fā)。在12.1.4節(jié)中我們已經(jīng)配置了界面代碼生成工具,只需利用該工具即可將ui界面自動生成為Python程序代碼。可以在Pycharm環(huán)境下,右鍵ui界面文件,選擇“Tools/ExternalTools/PyUCI”(前面配置的外部工具),即可自動生成Python程序代碼,如圖12-23所示。圖12-2312.1.6系統(tǒng)界面轉(zhuǎn)化為PyQt5代碼Part

12

執(zhí)行完成之后,我們可以在Pycharm環(huán)境下,看到項目文件夾多出了一個mygui.py文件,該文件就是ui界面轉(zhuǎn)換為Python程序代碼的文件,如圖12-24所示。雙擊可以打開該文件,可以看到該文件其實是一個Python類,后面可以對這個類的內(nèi)容進行修改,比如根據(jù)相關(guān)功能的程序?qū)崿F(xiàn)邏輯,增加定義其執(zhí)行函數(shù),并將這些函數(shù)連接到相關(guān)控件的回調(diào)函數(shù)中,并最終實現(xiàn)功能開發(fā)。類修改完成之后,引用該類并實例化對象,最終調(diào)用該對象即可完成本系統(tǒng)的開發(fā)。圖12-2412.1.6系統(tǒng)界面轉(zhuǎn)化為PyQt5代碼Part

12

下面我們對這個界面的Python類進行簡要解讀,首先觀察這個類的完整代碼,類的示例代碼如下:fromPyQt5importQtWidgets,QtCore,QtGuiclassUi_MainWindow(object):defsetupUi(self,MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(666,417)self.centralwidget=QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.pushButton=QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(20,20,91,31))self.pushButton.setObjectName("pushButton")self.label=QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(20,100,571,201))self.label.setObjectName("label")self.pushButton_2=QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(130,20,91,31))self.pushButton_2.setObjectName("pushButton_2")self.textEdit=QtWidgets.QTextEdit(self.centralwidget)self.textEdit.setGeometry(QtCore.QRect(240,20,104,31))self.textEdit.setObjectName("textEdit")12.1.6系統(tǒng)界面轉(zhuǎn)化為PyQt5代碼Part

12self.label_2=QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(370,20,71,31))self.label_2.setObjectName("label_2")MainWindow.setCentralWidget(self.centralwidget)self.menubar=QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0,0,666,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)

defretranslateUi(self,MainWindow):_translate=QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow","水色圖像水質(zhì)評價系統(tǒng)"))self.pushButton.setText(_translate("MainWindow","導(dǎo)入圖片"))self.label.setText(_translate("MainWindow","TextLabel"))self.pushButton_2.setText(_translate("MainWindow","水色識別"))self.label_2.setText(_translate("MainWindow","類別"))12.1.6系統(tǒng)界面轉(zhuǎn)化為PyQt5代碼Part

12

該類第一行導(dǎo)入的是PyQt5相關(guān)的包,class為類的關(guān)鍵字,類名稱為Ui_MainWindow,參數(shù)為默認的對象object。類中定義兩個函數(shù),一個為類的初始化函數(shù)setupUi,一個為各控件的命名。以上代碼都自動生成的,后續(xù)開發(fā)可以對其做修改及引用。12.1.7配置項目解釋器Part

12

默認情況下,Pycharm的項目解釋器僅有Python包安裝程序,很多開發(fā)包需要安裝,本章采用Python的集成開發(fā)環(huán)境Anaconda,也就是我們第一章安裝的Python開發(fā)環(huán)境,只要安裝了Anaconda,直接導(dǎo)入即可。下面詳細介紹如何配置Anaconda作為項目解釋器。

首先打開“Settings”選項,如圖12-25所示。圖12-25

在打開的設(shè)置選項界面中,找到項目解釋器選項,如圖12-26所示。圖中顯示了默認情況下,其解釋器僅有pip安裝工具,這種情況下很多開發(fā)包需要重新安裝。12.1.7配置項目解釋器Part

12

單擊圖中的設(shè)置圖標,即彈出添加項目解釋器按鈕,如圖12-27所示。圖中的設(shè)置圖標變成了“Add”按鈕圖標。圖12-26圖12-2712.1.7配置項目解釋器Part

12

單擊“Add”按鈕圖標,彈出添加項目解釋器界面,選擇系統(tǒng)解釋器,我們看到剛好就是Anaconda下的Python可執(zhí)行文件,如圖12-28所示。

圖12-28

單擊“ok”按鈕,即可將Anaconda的集成開發(fā)環(huán)境添加到項目解析器下,這時Anaconda集成的開發(fā)包到都可以在這個項目中使用了,從而避免了重新安裝項目所需的開發(fā)包。如圖12-29所示,單擊“ok”按鈕,即可將Anaconda集成的開發(fā)包成功添加到項目解析器下。12.1.7配置項目解釋器Part

12圖12-2912.1.8系統(tǒng)功能實現(xiàn)Part

12本系統(tǒng)實現(xiàn)的功能包括單擊導(dǎo)入圖片按鈕(pushButton),彈出圖片文件選擇對話框(QFileDialog,界面設(shè)計之外新增加的控件,用程序創(chuàng)建)選中水色圖片,并將圖片展示在label控件上,接著單擊面額識別按鈕(pushButton_2),實現(xiàn)對導(dǎo)入圖片的水色識別,最終將水色類型識別結(jié)果顯示在textEdit控件上。實現(xiàn)的基本思路為:(1)導(dǎo)入圖片按鈕(pushButton),需要關(guān)聯(lián)一個函數(shù),我們稱這個函數(shù)為回調(diào)函數(shù),該函數(shù)需要完成創(chuàng)建圖片文件選擇對話框并獲得選中圖片的具體路徑,同時利用Python的圖像處理庫PIL中的方法讀取該路徑下的圖片并顯示在label控件上。(2)面額識別按鈕(pushButton_2),也需要關(guān)聯(lián)一個回調(diào)函數(shù),該函數(shù)實現(xiàn)對水色圖像識別模型的訓(xùn)練及預(yù)測(識別),其中該模型選用第11章中基于支持向量機的水色圖像分類識別模型,訓(xùn)練數(shù)據(jù)即為第11章中203張水色圖像R、G、B三個顏色通道的一階、二階、三階矩共9個特征(X)和對應(yīng)的水色類別(Y),數(shù)據(jù)已經(jīng)準備好,見項目文件夾中的X.npy和Y.npy。識別的過程為先對導(dǎo)入圖片提取R、G、B三個顏色通道的一階、二階和三階矩共9個特征數(shù)據(jù),然而加載訓(xùn)練數(shù)據(jù)訓(xùn)練支持向量機模型,同時以導(dǎo)入圖片提取的9個特征數(shù)據(jù)作為自變量輸入支持向量機模型進行水色類型預(yù)測,最終將預(yù)測結(jié)果顯示在textEdit控件上。

導(dǎo)入圖片按鈕回調(diào)函數(shù)定義Part

12

在系統(tǒng)界面的Python類中定義一個函數(shù),命名為openimage,比如在初始化函數(shù)setupUi的后面定義這個函數(shù),如圖12-30所示。

其中QFileDialog來源于PyQt5.QtWidgets,因此需要在類前面添加以下導(dǎo)入命令:fromPyQt5.QtWidgetsimport*。同時導(dǎo)入系統(tǒng)模塊:importsys,方便后面對該類的引用。該函數(shù)一共有5行程序代碼,第一行代碼實現(xiàn)創(chuàng)建文件選擇框,并返回選擇圖片的文件名稱和圖片類型,由于文件選擇框是利用程序代碼創(chuàng)建,其父類并不是前面設(shè)計界面,也就是說它沒有父類,即用None表示;第二行代碼實現(xiàn)選中圖片的像素參數(shù)設(shè)置;第三行代碼將該圖片顯示在界面中的label控件中。第四行代碼將該圖片文件名保存下來,并設(shè)置為界面Python類的一個全局變量,用于數(shù)據(jù)的傳遞(面額識別函數(shù)需要用到該變量)。第五行代碼設(shè)置面額識別顯示的文本編輯框為空值,即每次導(dǎo)入圖片時對面額識別顯示的文本編輯框清空。導(dǎo)入圖片按鈕回調(diào)函數(shù)定義好之后,需要將該函數(shù)與導(dǎo)入圖片按鈕的單擊事件進行關(guān)聯(lián),即單擊導(dǎo)入圖片按鈕的時候就觸發(fā)該函數(shù)并執(zhí)行。關(guān)聯(lián)方法可以在初始化函數(shù)setupUi的后面輸入以下程序代碼實現(xiàn):self.pushButton.clicked.connect(self.openimage)。圖12-30

水色識別按鈕回調(diào)函數(shù)定義Part

12

在系統(tǒng)界面的Python類中定義再一個函數(shù),命名為svmtest,比如在openimage函數(shù)后面定義這個函數(shù),如圖12-31所示。圖12-31其中該函數(shù)定義的示例代碼如下:defsvmtest(self):fromPILimportImageimportnumpyasnppath=self.pathimg=Image.open(path)#讀取圖像

水色識別按鈕回調(diào)函數(shù)定義Part

12im=img.split()#分離RGB顏色通道R=np.array(im[0])/255*40#R通道row_1=int(R.shape[0]/2)-50row_2=int(R.shape[0]/2)+50con_1=int(R.shape[1]/2)-50con_2=int(R.shape[1]/2)+50R=R[row_1:row_2,con_1:con_2]G=np.array(im[1])/255*40#G通道G=G[row_1:row_2,con_1:con_2]B=np.array(im[2])/255*40#B通道B=B[row_1:row_2,con_1:con_2]#R,G,B一階顏色矩r1=np.mean(R)g1=np.mean(G)b1=np.mean(B)#R,G,B二階顏色矩r2=np.std(R)g2=np.std(G)b2=np.std(B)a=np.mean(abs(R-R.mean())**3)b=np.mean(abs(G-G.mean())**3)c=np.mean(abs(B-B.mean())**3)

水色識別按鈕回調(diào)函數(shù)定義Part

12#R,G,B三階顏色矩r3=a**(1./3)g3=b**(1./3)b3=c**(1./3)x1=np.array([r1,g1,b1,r2,g2,b2,r3,g3,b3])fromsklearn.svmimportSVCX=np.load('X.npy')Y=np.load('Y.npy')clf=SVC(class_weight='balanced')#類標簽平衡策略clf.fit(X,Y)y=clf.predict(x1.reshape(1,len(x1)))self.textEdit.setText(str(y[0]))

水色識別按鈕回調(diào)函數(shù)定義Part

12

該函數(shù)的使用類似第11章,首先是導(dǎo)入Python圖像處理包PIL及numpy包;其次是通過全局變量path=self.path獲得當前導(dǎo)入的圖片路徑,進而讀取該圖片并獲得R、G、B三個顏色通道的一、二、三階矩共9個特征數(shù)據(jù),記為x1;最后導(dǎo)入支持向量機分類模型,讀取訓(xùn)練數(shù)據(jù)對模型進行訓(xùn)練,并對導(dǎo)入的圖片進行水色類別預(yù)測(識別),最終將預(yù)測結(jié)果顯示在面額顯示文本編輯框textEdit中。面額識別按鈕回調(diào)函數(shù)定義好了之后,同樣需要與面額識別按鈕的單擊事件進行關(guān)聯(lián),即單擊面額識別按鈕的時候就觸發(fā)該函數(shù)并執(zhí)行。關(guān)聯(lián)方法可以在初始化函數(shù)setupUi的后面繼續(xù)輸入以下程序代碼實現(xiàn):self.pushButton_2.clicked.connect(self.svmtest)。同時,我們還注意到初始化函數(shù)setupUi的最后,還有一行增加的代碼:self.path='',其實是對導(dǎo)入圖片路徑全局變量做初始化,避免在沒有導(dǎo)入圖片的時候直接單擊面額識別按鈕,這時如果沒有做初始化則在執(zhí)行該回調(diào)函數(shù)的時候由于沒有找到改變量引發(fā)程序報錯并最終引發(fā)系統(tǒng)崩潰。

功能實現(xiàn)Part

12

定義好回調(diào)函數(shù)并修改完善界面的Python類之后,就可以引用該類進行實例化,并最終完成功能實現(xiàn)了??梢酝ㄟ^系統(tǒng)的_main_函數(shù)入口實現(xiàn)調(diào)用,首先創(chuàng)建一個系統(tǒng)應(yīng)用app,每個GUI界面都有一個系統(tǒng)應(yīng)用app負責運行,其次創(chuàng)建一個主窗體對象。對于主窗體GUI來說,前面這兩個步驟一般是相對固定的。接下來就可以引用前面設(shè)計的界面Python類了,并通過類中的初始化函數(shù)實現(xiàn)主窗體,最終通過主窗體的show屬性顯示出來。最后一步即退出系統(tǒng)應(yīng)用app。如圖12-32所示。圖12-32

最終運行mygui.py這個文件,即可實現(xiàn)系統(tǒng)界面功能的開發(fā),其效果如圖12-33所示。圖中顯示了該水色圖像被識別為第5類圖12-3312.1.9生成可獨立運行的EXE文件Part

12

事實上,前面開發(fā)的系統(tǒng)實現(xiàn)并沒有脫離Python的開發(fā)環(huán)境獨立運行,在現(xiàn)實應(yīng)用中一般需要將其編譯成一個可獨立運行的軟件系統(tǒng)。下面我們將詳細介紹如何將其編譯成一個能脫離Python開發(fā)環(huán)境獨立運行的軟件系統(tǒng)。安裝pyinstaller

使用pipinstalla安裝命令即可pyinstaller編譯包,如圖12-34所示可以在AnacondaPrompt下實現(xiàn)安裝。圖12-34

安裝依賴包Part

12

安裝好pyinstaller編譯包之后,還需要安裝幾個依賴包,它們是pywin32-ctypes、altgraph、pefile,如圖12-35所示。圖12-35

生成EXE文件Part

12

首先在AnacondaPrompt下利用操作命令切換至當前的項目文件夾路徑,其中該項目文件下如圖12-36所示。

利用命令:“pyinstaller-F需要編譯的文件”即可進行編譯,其中本項目需要編譯的程序文件為mygui.py。如圖12-37所示。圖12-36圖12-37

生成EXE文件Part

12

有時候并不能一次性編譯成功,比如會出現(xiàn)超出最大遞歸深度(如圖12-38)、編譯成功后運行EXE還可能會缺包等情況(如圖12-39),本節(jié)主要介紹這兩種常見的錯誤解決方法。圖12-38圖12-39

生成EXE文件Part

12實際上,即使編譯不成功在項目文件夾下也會產(chǎn)生一個與項目名稱相同的.spec文件,如圖12-40所示。圖12-40

該文件可以用Python開發(fā)環(huán)境pycharm或者Spyder打開。解決以上兩個問題的方法是對該文件進行修改,比如第一個問題是修改最大遞歸深度限制,第二個問題是由于某些開發(fā)包在編譯過程中不兼容編譯器所致,可以對相關(guān)的包單獨導(dǎo)入,如圖12-41所示。第一個框是導(dǎo)入系統(tǒng)模塊,并設(shè)置最大遞歸深度為5000,第二個框為單獨導(dǎo)入相關(guān)包,完整代碼為:hiddenimports=['cython','sklearn','sklearn.ensemble','sklearn.neighbors.typedefs','sklearn.neighbors.quad_tree','sklearn.tree._utils','scipy._lib.messagestream'],圖12-41

生成EXE文件Part

12

對mygui.spec文件修改完成之后,可以利用pyinstaller命令對這個文件進行再次編譯即可,即:“pyinstaller-Fmygui.spec”,如圖12-42所示。圖12-42

生成EXE文件Part

12

編譯成功之后,在項目文件夾下會存在兩個文件夾,一個是bulid,一個是dist,其中可執(zhí)行文件就存在dist文件夾中。如圖12-43所示。圖12-43

生成EXE文件Part

12

然而,該EXE文件還不能獨立運行,還需要開發(fā)環(huán)境中的platforms文件拷貝至該目錄下,該文件一般存放在Anaconda3安裝路徑中的plugins文件夾下,比如本電腦的完整文件夾路徑為“C:\ProgramData\Anaconda3\Library\plugins”,同時將項目所需的數(shù)據(jù)也拷貝至該目錄下,如圖12-44所示。圖12-44

如圖12-44,該文件下的mygui.exe就是可以獨立運行的系統(tǒng)文件,將該dist文件拷貝至其他沒有安裝Python開發(fā)環(huán)境的電腦也可以運行,至此我們的開發(fā)及編譯任務(wù)就完成了。12.2上市公司綜合評價系統(tǒng)Part

12

本節(jié)以第7章中基于總體規(guī)模與投資效率的上市公司綜合評價算法及程序?qū)崿F(xiàn)邏輯為基礎(chǔ),設(shè)計一個簡單的GUI可視化應(yīng)用界面,實現(xiàn)按申銀萬國行業(yè)分類標準和年份(2016~2018),對每個行業(yè)中的上市公司按年份進行綜合排名,其界面如圖12-45所示。圖12-45單擊申銀萬國行業(yè)分類標準下的每一個行業(yè),即可獲得該行業(yè)所有上市公司某個年份的綜合排名情況,默認是2016年,可以通過下拉框?qū)δ攴葸M行選擇,并顯示對應(yīng)年份的綜合排名結(jié)果。上一個案例已經(jīng)詳細介紹了Pycharm安裝、創(chuàng)建項目文件夾、配置QtDesigner和代碼生成工具、界面轉(zhuǎn)換為PyQt5程序代碼、配置項目解釋器、生成EXE方法等,這些知識在本節(jié)同樣適用,故本節(jié)不再介紹。本節(jié)主要介紹其界面設(shè)計、系統(tǒng)功能實現(xiàn)及編譯為EXE相關(guān)內(nèi)容。12.2.1界面設(shè)計Part

12

本案例的界面設(shè)計主要包括主窗體、樹控件(treeWidget)、表控件(tableView)和下拉框控件(comboBox),創(chuàng)建好主窗體之后從左邊的控件選擇欄中拖拽到其主窗體中即可,其界面設(shè)計如圖12-46所示。圖12-4612.2.1界面設(shè)計Part

12

創(chuàng)建好界面的ui文件,并生成PyQt5代碼之后,其項目文件夾如圖12-47所示。其中本案例的數(shù)據(jù)包括銀萬國行業(yè)分類標準表(sw.xlsx),該表可以從申銀萬國官網(wǎng)上下載。除此之外,還有股票代碼基本信息表(stkcode.xlsx)、2016~2018年的上市公司總體規(guī)模與投資效率指標(Data2016.xlsx~Data2018.xlsx),這些數(shù)據(jù)通過Tushare金融大數(shù)據(jù)社區(qū)提供的API獲取。同時,還有一個額外的.py文件,就是第7章中基于總體規(guī)模與投資效率指標的上市公司綜合評價方法函數(shù)(fun.py),返回綜合排名結(jié)果,包括代碼形式和股票簡稱形式,與第7章一致。圖12-4712.2.2系統(tǒng)功能實現(xiàn)Part

12

本系統(tǒng)實現(xiàn)的功能包括初始化樹結(jié)構(gòu)內(nèi)容和下拉框內(nèi)容,在類初始化函數(shù)中對其修改即可實現(xiàn)。除此外之外還包括樹單擊事件回調(diào)函數(shù)、下拉框值選中回調(diào)函數(shù)和下拉框值改變回調(diào)函數(shù)實現(xiàn)。下面詳細進行介紹。初始化樹結(jié)構(gòu)和下拉框內(nèi)容

對樹結(jié)構(gòu)初始化內(nèi)容,可以通過讀取申銀萬國行業(yè)分類標準表中的數(shù)據(jù),獲得所有行業(yè)的分類,用一個列表來存放;以“申銀萬國行業(yè)分類”命名為根節(jié)點,通過一個循環(huán)把所有行業(yè)分類名稱依次添加到根節(jié)點下面??梢栽诔跏蓟瘮?shù)中添加示例代碼如下:dsw=pd.read_excel('sw.xlsx')ind=sw.iloc[:,0].value_counts()indname=list(ind.index)#所有行業(yè)分類名稱root=QTreeWidgetItem(self.treeWidget)root.setText(0,'申銀萬國行業(yè)分類')root.setText(1,'0')foriinrange(len(indname)):child=QTreeWidgetItem(root)child.setText(0,indname[i])child.setText(1,str(i))對于下來框內(nèi)容的初始化,即添加2016、2017、2018三個年份作為初始化內(nèi)容,可以通過以下命令實現(xiàn)。boBox.addItems(['2016','2017','2018'])

樹單擊回調(diào)函數(shù)實現(xiàn)Part

12

單擊樹中的節(jié)點,即選中對應(yīng)的行業(yè)分類名稱,則在表格控件中顯示該行業(yè)名稱對應(yīng)年份的綜合排名結(jié)果。其中默認為2016年,也就是說只單擊樹節(jié)點,不執(zhí)行拉框選擇的情況下,表格控件顯示2016年的綜合排名結(jié)果。其中在表格控件中顯示選中行業(yè)的某個年份綜合排名結(jié)果,我們單獨定義一個函數(shù)來實現(xiàn),這個函數(shù)不僅在樹單擊回調(diào)函數(shù)中使用,同樣在下拉框選中值的回調(diào)函數(shù)和更新值的回調(diào)函數(shù)中也使用,這個函數(shù)命名為eval_fun,在界面Python類中定義。樹單擊回調(diào)函數(shù)定義如圖12-48所示。圖12-48

圖12-48中第一行程序代碼是修改一個全局變量的值,在初始化函數(shù)的后面已經(jīng)做了初始化定義為0,這里修改為1。主要的作用是判斷有沒有執(zhí)行樹單擊操作,如果執(zhí)行了值為1,否則為0。第二行程序代碼是將當前選中行業(yè)名稱2016年(默認)的綜合排名結(jié)果顯示到表格控件中,通過調(diào)用eval_fun函數(shù)實現(xiàn)。第三行代碼是判斷當前下拉框是否選擇了非默認值的年份(2017或2018),chg_i其實也是一個全局變量,在初始化函數(shù)后面已經(jīng)做了初始化定義為2016。第四行業(yè)程序代碼,如果下拉框選擇了非默認值年份,則顯示當前選中行業(yè)名稱選中年份的綜合排名結(jié)果到表格控件中。也是通過調(diào)用eval_fun函數(shù)實現(xiàn)。

樹單擊回調(diào)函數(shù)實現(xiàn)Part

12其中eval_fun函數(shù)定義示例代碼如下:defeval_fun(self,year):importfun#導(dǎo)入第7章中基于總體規(guī)模與投資效率的綜合評價函數(shù)

#獲得當前的樹節(jié)點,以便判斷當前的行業(yè)名稱,通過item.text(0)來獲取當前行業(yè)名稱

item=self.treeWidget.currentItem()data=pd.read_excel('Data'+year+'.xlsx')#讀取數(shù)據(jù)

#獲得當前行業(yè)名稱的所有上市公司股票代碼

code=[]foriinrange(len(data)):code.append(data.iloc[i,0][:6])sw=pd.read_excel('sw.xlsx',dtype=str)code1=list(sw.iloc[sw['行業(yè)名稱'].values==item.text(0),1].values)#獲得當前行業(yè)名稱的所有上市公司股票代碼在data中的index序號

index=[]forcincode1:a=cincodeifa==True:index.append(code.index(c))#從data中篩選出當前行業(yè)名稱所有上市公司股票代碼對應(yīng)的數(shù)據(jù)

dt=data.iloc[index,:]

樹單擊回調(diào)函數(shù)實現(xiàn)Part

12#調(diào)用第7章中基于總體規(guī)模與投資效率的綜合評價函數(shù),獲得綜合排名結(jié)果#其中s1為股票代碼簡稱的排名方式,排名結(jié)果數(shù)據(jù)結(jié)構(gòu)為序列,index為股票簡稱,值為綜合得分r=fun.Fr(dt)s1=r[1]#如果排名結(jié)果數(shù)據(jù)大于0,構(gòu)造一個數(shù)據(jù)顯示模型,類似于二維表,用于顯示在表格控件上iflen(s1)>0:#數(shù)據(jù)顯示模型的行數(shù)為len(s1),列數(shù)為2self.model=QStandardItemModel(len(s1),2)#數(shù)據(jù)顯示模型的字段名稱self.model.setHorizontalHeaderLabels(['公司簡稱','綜合得分排名'])#循環(huán)地實現(xiàn)數(shù)據(jù)顯示模型中的每個值forrowinrange(len(s1)):forcolumninrange(2):ifcolumn==0:a=QStandardItem(s1.index[row])else:a=QStandardItem(str(s1[row]))self.model.setItem(row,column,a)#行下標,列下標,值(字符串)#將數(shù)據(jù)顯示模型設(shè)置到表格控件中并顯示self.tableView.setModel(self.model)最后,將樹單擊回調(diào)函數(shù)關(guān)聯(lián)到樹單擊事件函數(shù)中,在初始化函數(shù)setupUi后面通過以下命令來實現(xiàn):self.treeWidget.clicked.connect(self.selectname)。

下拉框值選中回調(diào)函數(shù)實現(xiàn)Part

12

下拉框值選中回調(diào)函數(shù)的功能是在樹節(jié)點行業(yè)名稱被選中情況下,將選中年份的綜合排名結(jié)果顯示

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論