開發一款軟件,選擇何種開發語言,選擇選定語言下的開發框架,選擇何種類型的數據庫,選擇何種並行框架等等都是軟件工程師必須考慮和深刻研究的課題,至於我爲何選擇python,由於在python語言學習上花費的時間最久,最爲了解,若是有一種語言我足夠了解而且在某些應用領域要優於python,我會拋棄python。至於gui框架爲何選擇PyQt,我也不是很清楚,純屬偶然的機會看到pyqt的demo界面和裏面的各個程序,個人第一印象是幾行簡單的代碼就可完成漂亮的界面編寫,It's amazing!慢慢的,隨着對PyQt的學習,其中不少優秀的特性令我癡迷:php
1.豐富的庫,不僅僅是gui庫,其餘網絡庫,多線程,多進程等等:css
QtCore
模塊主要包含了一些非GUI的基礎功能,包含事件循環與Qt的信號機制。此外,還提供了跨平臺的Unicode、線程、內存映射文件、共享內存、正則表達式和用戶設置。html
QtGui
模塊包含了大多數的GUI類型。包含按鈕、文本框、列表等常見控件,還包含了基於MVC設計模式的列表、表格、樹型控件。同時還提供了一個可以容納成千上萬個元素的畫布控件,其中能夠放置各類控件和圖形。此外,還能夠QtGui還支持界面動畫與界面狀態機編程。python
QtNetwork
模塊能夠用於編寫非阻塞式的UDP、TCP程序。還包含了DNS、HTTP與FTP的客戶端。web
QtOpenGL
模塊容許Qt程序使用OpenGL渲染3D圖形在,並且沒必要大量更改代碼。正則表達式
QtSql
模塊支持多種SQL數據庫。包括sqlite、ODBC、MySQL、PostgreSQL、Oracle。還提供了一個基於MVC模式的數據模型,與QtGui的的表格控件配合使用。算法
QtXml
包含一個XML解釋器,同時支持SAX和DOM兩種編程方式。sql
QtWebkit
與 QtScript
兩個子模塊支持WebKit與EMCAScript腳本語言mongodb
Phonon
子模塊支持高級的多媒體編程。包含音頻播放器、視頻播放器與聲效處理。數據庫
uic
子模塊可以將Qt的窗體文件轉換爲Python代碼,可以即時讀入窗體文件而且顯示出來。它依賴於QtXml模塊。
QScintilla
子模塊包含一個基於Scintilla的文本編輯器控件,Eric IDE使用它做爲代碼編輯器。
QtMultimedia
提供了底層的多媒體支持,如今多數開發者改用Phonon模塊。
QtSvg
支持SVG 1.2Tiny的靜態標準,用於顯示與保存SVG格式的圖形。
PyQt包含了大約440個類型、超過6000個的函數和方法:
2.信號與槽機制:
old-style connection:
1 |
self.connect(self, SIGNAL( "mySignal(int)" ), self, SLOT( "mySlot(int)" )) |
new-style connection:
1 |
self.mySignal.connect(self.mySlot) |
Qt採用了signal和slot的概念來處理GUI程序中的用戶事件。PyQt一樣支持這種方法,還進而針對Python的特色加強了某些功能。任何Python類型均可以定義signal和slot,並與GUI控件的signal和slot相鏈接。PyQt支持old-style與new-style兩種鏈接方式。不過,目前通常推薦使用new-style connection。
由於它還支持鏈接到Python函數,並且看起來也比較pythonic。
3.支持類css的qss進行樣式控制,界面美化輕輕鬆鬆
4.全新的界面開發方式qml(集html和css於一體的語言)
開發語言: python2.7 + PyQt4 + sqlit3 + py2exe + Inno Setup Compiler
PyQt是一個建立GUI應用程序的工具包。它是Python編程語言和Qt庫的成功融合。Qt庫是目前最強大的庫之一。PyQt是由Phil Thompson 開發。 PyQt實現了一個Python模塊集。它有超過300類,將近6000個函數和方法。它是一個多平臺的工具包,能夠運行在全部主要操做系統上,包括UNIX,Windows和Mac。 PyQt採用雙許可證,開發人員能夠選擇GPL和商業許可。在此以前,GPL的版本只能用在Unix上,從PyQt的版本4開始,GPL許可證可用於全部支持的平臺。由於可用的類有不少,他們被分紅幾個模塊。
QtCore模塊包含核心的非GUI功能。該模塊用於時間、文件和目錄、各類數據類型、流、網址、MIME類型、線程或進程。
QtGui模塊包含圖形組件和相關的類,例如按鈕、窗體、狀態欄、工具欄、滾動條、位圖、顏色、字體等。
QtNetwork模塊包含了網絡編程的類,這些類容許編寫TCP/IP和UDP的客戶端和服務器,他們使網絡編程更簡單,更輕便。
QtXml包含使用XML文件的類,這個模塊提供了SAX和DOM API的實現。
QtSvg模塊提供顯示的SVG文件的類。可縮放矢量圖形(SVG)是一種用於描述二維圖形和圖形應用程序的XML語言。
QtOpenGL模塊使用OpenGL庫渲染3D和2D圖形,該模塊可以無縫集成Qt的GUI庫和OpenGL庫。QtSql模塊提供用於數據庫的類。
Python(KK 英語發音:/ˈpaɪθən/,是一種面向對象、直譯式計算機程序設計語言,由Guido van Rossum於1989年末發明,第一個公開發行版發行於1991年。Python語法簡捷而清晰,具備豐富和強大的類庫。它常被暱稱爲膠水語言,它可以很輕鬆的把用其餘語言製做的各類模塊(尤爲是C/C++)輕鬆地聯結在一塊兒。常見的一種應用情形是,使用python快速生成程序的原型(有時甚至是程序的最終界面),而後對其中有特別要求的部分,用更合適的語言改寫,好比3D遊戲中的圖形渲染模塊,速度要求很是高,就能夠用C++重寫。
python2.7:
PyQt4:
sqplit3:
SQLite是一個包含在C庫中的輕量級數據庫。它並不須要獨立的維護進程,而且容許使用非標準變體(nonstandard variant)的SQL查詢語句來訪問數據庫。一些應用但是使用SQLite保存內部數據。它也能夠在構建應用原型的時候使用,以便於之後轉移到更大型的數據庫,好比PostgreSQL或者Oracle。
py2exe:
py2exe是一個將python腳本轉換成windows上的可獨立執行的可執行程序(*.exe)的工具,這樣,你就能夠不用裝python而在windows系統上運行這個可執行程序
Inno Setup Compiler:
Inno Setup 是一款免費的安裝製做工具。簡潔而強大,支持 pascal 腳本,既有適合新手的腳本嚮導,也有適合高手的的腳本編輯器。是一個不可多得的安裝製做軟件!英文版可在官方軟件中下載,但不支持中文;漢化版可在
inno setup chinese中下載
UI層:
總體風格採用Metro風格,利用qss對頁面上的全部控件進行樣式控制;
若是利用webkit渲染html,我選擇Bootstrap Metro UI CSS對html元素進行樣式控制,使得程序的總體具備Metro風格。
風格:
界面框架:
頁面結構設計,採用基於QMainWindow的主體窗口;中心窗口控制頁面間的切換邏輯和淡入淡出效果:中心窗口的核心控件爲堆窗口控件QStackedWidget,集成各個功能單元模塊,每一個獨立的頁面獨立開發,互不影響;
頁面切換和導航命名規則說明:每一個頁面採用首字母大寫的單詞表明相應的功能模塊:
經過配置文件config.py對全部的窗口基本樣式進行控制
功能模塊子頁面設計概述:
功能單元集合庫childpages庫:childpages庫爲各個功能單元的集合,每一個function+page.py文件表明一個獨立的單元,全部獨立的單元繼承自basepage.py中的BasePage類;
basepage.py中BasePage類的做用:實現全部功能單元模塊的共同功能;
function+page.py中 Function+Page類的做用: 實現每一個功能單元模塊;
功能單元具體設計–Function+Page類:
若是使用這種方式進行UI編寫,html模板的使用,選擇好的模板將相當重要;python中關於html的模板選擇較多,模板的選擇使用能夠參見以下:
本項目中使用的Cheeth模板,關於Cheeth的使用參見Cheeth用戶指南
1.基於QtGui.QWidget進行gui頁面設計:
2.基於QtWebKit.QWebView進行html頁面設計
3.基於QML和QtDeclarative.QDeclarativeView進行Qt Quick頁面設計
原生方式進行圖形界面設計,須要對Qt的各個控件用法加以理解;
風格控制:利用stylesheet對各個控件進行樣式,便是利用Qt提供的qss對外觀進行控制;qss的主要功能與最目的都是能使界面的表現與界面的元素分離,即質與形的分離,就如同一我的能夠在不一樣的時候穿上不一樣的衣服同樣,css機制的引入,使得設計一種皮膚與界面控件分離的軟件成爲可能,應用程序也能像web界面那樣隨意地改變外觀
業務邏輯層:
1.app層:主要負責數據庫層,通訊層,算法層,UI層之間的數據交互
2.db層: 主要負責相關數據的存儲:
非關係型數據庫: 選擇mongodb,利用mongokit庫
或者pymongo庫
進行數據的操做和定義
3.tcp/ip層:主要負責通訊協議的定義、客戶端與服務端的實現等:
4.algrithom層: 主要負責對採集的數據進行處理並輸出結果到界面上顯示:
關係型數據庫:不存在大數據的存儲問題,選擇python內置的split3是個不錯的選擇,數據以文件的形式存儲在本地;
通訊協議定義使用dpkt庫:
服務端框架使用SocketServer庫:
涵蓋與業務邏輯相關的模塊應用層(app層),數據庫層(db層),通訊層(tcp/ip層),算法層(algrithom層)等,具體定義依據項目需求而定,例如個人項目: