1. 程式人生 > >Python學習之旅:用Python製作一個打字訓練小工具

Python學習之旅:用Python製作一個打字訓練小工具

一、寫在前面

  說道程式設計師,你會想到什麼呢?有人認為程式設計師象徵著高薪,有人認為程式設計師都是死肥宅,還有人想到的則是996和 ICU。

  

  別人眼中的程式設計師:飛快的敲擊鍵盤、酷炫的切換螢幕、各種看不懂的字元程式碼。

  然而現實中的程式設計師呢?對於很多程式設計師來說,沒有百度和 Google 解決不了的問題,也沒有 ctrl + c 和 ctrl + v 實現不了的功能。

   

  那麼身為一個程式設計師,要怎麼讓自己看起來更加“專業”呢?答案就是加快自己的打字速度了,敲的程式碼可能是錯的,但這個13卻是必須裝的!

  然而還是有不少人打字不那麼快的,可能就需要訓練下了,但是既然身為程式設計師,為何不自己寫一個訓練打字的小工具出來呢?

 

二、基本思路

  使用 PyQT5 開發 GUI,實現顯示句子並讓使用者輸入,然後將輸入的內容和給出的句子進行比對,同時記錄所用的時間,最後將正確率輸出來。為了能夠持續打字輸入,還需要做一個“下一句”的功能。在實現了這兩個基本的功能後,一個簡單的打字訓練小工具就做出來了。

 

三、介面設計

1.環境配置

  PyQT5 的開發環境配置在上一篇部落格中已經說過了,因而這裡不再贅述,如果不清楚的可以點這裡檢視。

2.介面設計

   要進行介面設計,得先開啟 QtDesigner,然後新建專案,選擇 Widget:

   

   然後就往裡面拖控制元件就好了,這還是很方便的,主要用的控制元件包括 Label、Text Edit、Push Button等,雙擊控制元件之後可以在右側修改控制元件的各種屬性。最終設計出的介面如下:

   

3.生成 Python 程式碼

  在設計完介面之後,將生成的結果儲存下來,會得到一個 .ui 為字尾的檔案。這個檔案我們還是無法直接使用的,需要轉變成 Python 程式碼才行。此時就需要使用 pyuic5 命令了,不懂的可以點這裡檢視我的上篇部落格。

 

四、槽函式

 1.槽函式簡介

  要進行功能設計,就得先知道槽函式。槽是普通的 C++ 成員函式,槽在 Qt 開發軟體中是一個很重要的概念,在 Qt 裡與訊號連線的就是槽,我們一般稱之為槽函式。

  在使用訊號的時候,有四個引數:

  1)sender:發出訊號的物件;

  2)signal:傳送物件發出的訊號;

  3)receiver:接收訊號的物件;

  4)slot:接收物件在接收到訊號之後所需要呼叫的函式(槽函式)。

2.使用方法

(1)第一種方法

  第一步,在 QtDesigner 中點選 “Edit Signals/Slots”,然後左鍵點選按鈕後將滑鼠拖到另一個 Label 上:

  

   第二步,在彈出的設定框中選擇具體的方法及功能。

  

   這樣做很簡單,但是也有缺陷,問題在於不能自定義方法,只能使用給定的方法。

(2)第二種方法

  在右下角找到 “Signal/Slot Editor” 並點選,然後就可以點選 “+” 建立訊號了。

  

   這種方法能夠讓我們自定義了,但是也不算方便,尤其是當你不知道具體要實現什麼方法的時候。

(3)第三種方法

  使用 connect() 方法,傳入的引數為一個方法名稱。例如:

btn.clicked.connect(func)

 

五、功能實現

1.繼承函式

  使用 pyuic5 生成 py 檔案中定義了一個 Ui_Form 類,其中包含了對各種控制元件的定義等,如果我們要增加其他功能,且直接在這個 py 檔案中修改的話,那麼之後要更新介面之類的就不會不方便了,所以最好的方法是繼承 Ui_Form 類,然後在繼承類中新增修改。參考程式碼如下:

 1 import sys
 2 from PyQt5 import QtWidgets
 3 from typing.ui import Ui_Form
 4 
 5 
 6 class MyForm(Ui_Form, QtWidgets.QWidget):
 7     def __init__(self):
 8         super(MyForm, self).__init__()
 9         self.setupUi(self)
10 
11 
12 if __name__ == '__main__':
13     app = QtWidgets.QApplication(sys.argv)
14     my_form = MyForm()
15     my_form.show()
16     sys.exit(app.exec_())

2.隱藏顯示控制元件

  有時候我們可能會需要將某些控制元件隱藏起來,這裡簡單介紹幾種方法。

  1)setHidden(bool)    設定控制元件是否隱藏;

  2)hide() 隱藏控制元件;

  這兩種隱藏的方法會完全隱藏控制元件,即不保留控制元件所佔的位置。但如果要保留位置的話,可以使用下面這種方法:

# 將透明度設定為0,達到隱藏且保留位置的目的
op = QtWidgets.QGraphicsOpacityEffect()
op.setOpacity(0)
self.lable.setGraphicsEffect(op)

3.判斷輸入內容 

  這一功能的實現需要在點選“提交”按鈕時獲取輸入框中的內容,再和給出的文字進行對比,最後將結果返回顯示出來。

 1 def click(self):
 2     """
 3     點選按鈕時呼叫
 4     :return: 
 5     """
 6     self.get_time()
 7     the_input = self.textEdit.toPlainText()
 8     # 計算準確率
 9     count = 0
10     for i in range(len(the_input)):
11         if the_input[i] == self.text[i]:
12             count += 1
13     accuracy = count / len(self.text) * 100
14     # print(accuracy)
15     self.show_label()
16     # 設定提示資訊
17     info = "有點可惜,你的正確率是:  %.2f%%  " % accuracy if accuracy != 100 else "恭喜你全對了呢!繼續加油哦!"
18     self.info_lable.setText(info)

  對於我這種懶人來說,點選按鈕這種操作都是費力的,所以最好加入一個快捷鍵,這樣就方便多了,可以使用如下方法設定:

# 設定快捷鍵
self.submit_btn.setShortcut('ctrl+e')

 

六、執行結果

  最終執行結果的截圖如下:

  

   提交之後還可以點選下一句繼續訓練:

  

 

  完整程式碼已上傳到 GitHu