結對編程 | PYQT |窗口美化|程序打包(李南希&魏驊瑋)

由於之前學過QT,再加上以前的代碼是用python的,因此就選擇了用pyqt來作界面。

QT作界面一個重要優勢就跨平臺,固然這裏咱們主要仍是以爲它由於比較簡單(相較於win32和MFC來講能夠說是我這種小菜鳥的福音了)。惋惜的是目前pyqt尚未相似於C++的QT Creator,不能方便的直接在界面設計裏添加槽函數。當是能夠經過qt designer來繪製界面也省下很多功夫。儘管作過QT,可是邊學邊作的過程當中我和個人小夥伴仍是遇到很多困難…

  • 如何美化界面

  • 窗口設計好後不能有效切換窗口

  • 如何進行題目求解,怎麼設計答案選項才更接近日常的考試

  • 窗口不能返回到以前的界面

 

 其中,窗口部分由我設計的,如下我在寫窗口過程當中遇到問題和解決方法:

窗體設計html

qtdesigner經過組建拖拽作界面很簡單,網上教程也不少,可是樣式設計的進階教程倒是很難找到。想要作一個相似QQ登陸界面並不簡單。設計登陸界面以下:python

主要的困難在於須要去掉窗口的標題欄,沒有標題欄就不能關閉和最小化,也不能進行窗口的拖拽,因此須要重寫最小化和關閉按鍵,以及實現拖拽,代碼入下:編程

self.close.clicked.connect(QCoreApplication.instance().quit)
self.bmin.clicked.connect(self.showMinimized)

關閉按鍵和最小化按鍵響應事件設置ide

    # 重寫三個方法使窗口支持拖動,上面參數window就是拖動對象
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = event.globalPos() - self.pos()
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_drag:
            self.move(QMouseEvent.globalPos() - self.m_DragPosition)
            QMouseEvent.accept()

    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

想要讓界面更加美化一點須要用到QSS(樣式表),很遺憾關於樣式表教程並很少,QSS相似網頁設計CSS(就是來源於吧==)函數

以關閉按鈕舉例:實現按鈕,鼠標選中和鼠標按下三種不一樣狀況的貼圖優化

圖片素材:對應三種按鍵狀況ui

"QPushButton{background-image:url(./qrc/btn_close_mormal.png);width:39px;height:18px;padding-top:0px;border:0px;}"
"QPushButton:hover{background-image:url(./qrc/btn_close_highligt.png)}"
"QPushButton:pressed{background-image:url(./qrc/btn_close_down.png)}"

分別定義三種情形的QSS樣式表,在代碼中用setStyleSheet("qss")函數進行設置。url

 

 滑塊與微調框spa

  設計用戶選擇題目數量的部分,我選擇了滑塊組件,能夠很方便的限制題目範圍在10-30之內,可是滑塊並不能顯示數字,因而我加了spinBox(微調框)來選擇題目數和顯示數字命令行

  如何把滑塊與微調框的值綁定起來,百度後知道是須要分別寫兩個組建的valueChanged的槽函數,也沒找到源碼實例,就只有本身寫了。 

self.nub_horizontalSlider.valueChanged.connect(self.spin_change)        #類中加入事件
self.nub_spinBox.valueChanged.connect(self.slider_change)
'''
--------------------------------------------------------------------------
'''
    def spin_change(self):                                                  #綁定滑塊與控件,使其中一個改變另外一個也改變
        self.nub_spinBox.setValue(self.nub_horizontalSlider.value())

    def slider_change(self):
        self.nub_horizontalSlider.setValue(self.nub_spinBox.value())

 

倒計時

  在作題過程當中,須要加入考試倒計時,當倒計時結束中止答題。倒計時我經過數碼管組建來作,可是因爲時間匆忙,並無達到我想要的樣子。

  

倒計時要用到QTimer模塊,經過一個定時器得到時鐘頻率,就和硬件實訓的定時器差很少。

from PyQt5.QtCore import QTimer

#窗口類中加入定時器
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.timer_oprate)
        self.timer.start(1000)

#槽函數,計數-1,當爲0時關閉窗口
     def timer_oprate(self):  
        self.time_lcdNumber.display(self.time_lcdNumber.intValue()-1)
        if self.time_lcdNumber.intValue() == 0:
            self.myWin5 = ui_score.MyWindow5()
            self.myWin5.show()
            self.hide()

 

打開網頁連接

  個人小夥伴還寫了一個html的誠信考試協議,嘻嘻,不籤協議怎麼能讓你考試呢是吧:)

   打開本地html文件我是經過os模塊執行start命令行命令來實現,可是有個問題是打開的時候會出現黑窗口閃爍,這個bug尚未解決。

 

程序打包

   終於完成項目後怎麼能不和小夥伴們分享呢(特別是讓家裏的弟弟妹妹感覺一下被算術統治的恐怖hhh)。

  python打包的方法有幾種,經常使用的是Py2exe和PyInstaller,由於前者用於老版本的python,可能打包過程當中會出現各類問題,我選擇了或者。安裝方式很簡單,直接pip install PyInstaller。

  pyinstaller語法也簡單執行命令: pyinstaller main.py

  main.py是我程序入口,固然個人工程裏不能只有一個py文件,因此你會發現這樣打包後的exe並不能用QAQ

  加上-w參數,會遞歸打包引用的其餘py:  pyinstaller -w main.py

  (我試過加上-F,打包成一個文件,可是最後的exe並不能運行,我也不知道爲啥)

  而後會看到新增長了兩個目錄build和dist,dist下面的文件夾裏的exe就是能夠發佈的可執行文件。固然,得把你的資源文件複製到文件夾下面。EXE文件會自動加上一個圖標,若是想改本身的圖標輸入pyinstaller時命令添加一個 -i picture.ioc(路徑),太懶(困)我就沒弄…

  

  點擊main.exe就能夠運行了,其實這個課執行文件比我想象中的要小,才1608K,固然包括其餘動態庫就不止這點了,QT的一個很差的地方就是設計的程序會比通常其餘開發環境的大上一些。

  固然,以爲這麼多文件不美觀,ctrl+shift拖動文件在桌面建個快捷方式吧。

 

總結:

  給咱們第一感受就是此次結對編程作得太趕了,不少地方想去優化都來不及,好比一些提示的地方我用們了彈窗,可是如今好像用彈窗的地方已經不多了,影響用戶體驗,不少程序都是在窗口上顯示提示信息,能夠經過label來實現。

  還有想吐槽的就是Pycharm太讓人失望了(難受),在咱們作窗口切換的時候,它竟然不顯示錯誤緣由,就這麼傲嬌的結束運行了??(Fxxx)仍是最後一天凌晨在室友電腦上用另外一個IDE才知道哪裏錯了(喜極而泣)。

  經過此次實驗我和個人搭檔雖然有臨時抱佛腳的嫌疑,可是確實學到不少,是一筆寶貴的經驗,有一種再讓咱們作一個桌面程序能夠分分鐘搞定的感受hhh。最後感謝一下咱們室友的幫助(誰讓他先作完呢=)

相關文章
相關標籤/搜索