用Python開發實用程式 – 計算器

Sui_da_xia發表於2020-02-17

作者:隋順意

一段時間前,自己製作了一個庫 “sui-math”。這其實是math的翻版。做完後,python既然可以輕易的完成任何的數學計算,何不用python開發一個小程式專門用以計算呢?

現在我們越來越依賴於計算器,很多複雜的計算都離不開它。我們使用過各式各樣的計算器,無論是電腦自帶的,還是網也上的計算器,卻都沒有自己動手編寫屬於自己計算器。今天就讓我們走進計算器的世界,用python來編寫一個可以用的計算器。

廢話不多說,來看看
編寫計算器:
效果圖:

使用者可以通過滑鼠或鍵盤來輸入或刪除數字或符號,按下等號便可計算。
本教程藉助python的 pygame 庫來實現程式。當然,看完本教程後,你還可以通過利用,pygame 來這製作小遊戲。所以下面稍稍介紹一下pygame及其安裝。

安裝:

pip install -U pygame

計算器的關鍵邏輯:

其實邏輯就是不斷地獲取使用者的操作,直到使用者按下quit鍵(關閉)。這個不斷獲取操作,並不斷的操作做出反應。這個過程叫做:事件處理器。

那怎麼做出一個“事件處理器”呢?其實,就是一個大大的 “while True:” 把從啟動到結束,對使用者所的操作做出的反應給包起來。這讀起來有點繞口,等會會有詳細的程式碼。

如何計算:

計算對於有些其他的語言來說,計算是個大大的問題。但python不同,它有個特殊的內建函式,叫做eval。這個只有四個字母的函式,解決了計算器的運算。

打個比方:現在已經可以獲取使用者所作出的操作,比如說按下符號,或者是數字。但是,怎麼知道使用者會在按下等號前,按下多少個符號和數字呢?使用者有可能按1個數字,也有可能按一百個數字,可能是一個符號,可能是好幾個符號。

因此,不妨設定一個變數,一個空的字串符。

1.	num = "" 

每當使用者按下一個數字或者一個符號,就在這個字串符裡增加這個數字和符號。每次按下這個字串符後,就在螢幕裡顯示這個字串符。舉個最簡單的例子:

> 1.	num += str(1)  
> 2.	word = t.render(num,True,(0,0,0),(225,225,225))  
> 3.	screen.blit(word, (XXX,XXX))   #XXX代表位置
> 4.	pygame.display.update()       #更新螢幕

當使用者按下 ”1” 的時候,num就會增加字串符1。第2,3行實現了在螢幕上顯示這個字串符。(會在後面詳細解釋)再將螢幕 “更新”。(這行是必須寫的,不然螢幕不會顯示)

當使用者按下等號的,字串符就停止增加,開始計算。Eval專門用來計算字串符的。當計算後,將計算好的數字顯示出來,最後將字串符清零。程式碼:

1.	a = str(eval(num))   #計算字串符
2.	word = t.render(a,True,(0,0,0),(225,225,225))  
3.	screen.blit(word,p)  
4.	num = ""             #字串符清空
5.	pygame.display.update()

圖片的滑鼠處理:

一個簡易的計算器原理已經可以做出來了,但是要讓使用者直觀的看到按鈕,比如按鍵,就需要匯入圖片了

Pygame的圖片可以使用.png的格式,可以自己畫,也可以從網上搜。我就是自己用畫圖板畫的:

在這裡插入圖片描述
(未經允許,禁止盜取)

Pygame需要在程式開始前先匯入,程式碼如下:

1.	XXX = pygame.image.load("XXX/XXX.png")  

獲取使用者是否按下這個按鍵需要就是一個if語句,程式碼如下。

1.	while True:  
2.	    one = pygame.image.load("E://XXX/py1.png")  
3.	    ···  
4.	    if event.type==pygame.MOUSEBUTTONDOWN:  
5.	        x, y = pygame.mouse.get_pos()  
6.	        if XXX <= x <= XXX and XXX <= y<= XXX:   #1的位置  
7.	            num += str(1)  
8.	            word = t.render(num,True,(0,0,0),(225,225,225))  
9.	            screen.blit(word,p)  
10.	            pygame.display.update()  

拿“1”打個比方。第五行的 “x”和“y” 是獲取使用者滑鼠的位置。
在第六行,前兩個XXX是定點陣圖片的x軸,後兩個XXX是定點陣圖片y軸。其實,你只需定位第一個和第三個位置即可。每張圖片都有寬,長。比如你要對當使用者按下一個長寬都是100的圖片,同時,要將這個程式碼定位在,(0,0)的位置,看程式碼:

1.	while True:  
2.	    ···  
3.	    if event.type==pygame.MOUSEBUTTONDOWN:  
4.	        x, y = pygame.mouse.get_pos()  
5.	        if 0 <= x <= 100 and 0 <= y<= 100:     
6.	            ···  

對於一些不知道怎樣得知圖片的長寬的小白,底下有張圖片,

在這裡插入圖片描述
鍵盤處理:
先看程式碼:

1.	while True:  
2.	    ···  
3.	     if event.type == KEYDOWN:  
4.	         if event.key == K_1 or event.key == K_KP1:      #1  
5.	         num += str(1)  
6.	         word = t.render(num,True,(0,0,0),(225,225,225))  
7.	         screen.blit(word,p)  
8.	         pygame.display.update()  

pygame給每一個鍵盤都命名了,比如說,1就是 “K_1”,小鍵盤1就是 “K_KP1”。也就是說,當使用者按下K_1(數字鍵1)這個按鍵的時候,做出反應。

若是想要pygame的鍵盤對印表,請到https://github.com/duoduo666/jisuanba_pygame_jisuanji
這個地址。(也是我的github)。裡面也有完整的程式碼

Pygame初始化
先配合著註釋閱讀程式碼。

1.	import sys                      
2.	import pygame  
3.	from pygame.locals import *       #pygame裡有許多像pygame.XXX.YYY的形式  
4.	  
5.	def calculater()#calculater僅僅是我自己的定義   
6.	    pygame.init()                             #初始化pygame  
7.	    screen_size = width,height = XXXX, XXXX   #這個是定義螢幕大小,根據自己電腦做出判斷  
8.	    screen = pygame.display.set_mode(screen_size)  
9.	    pygame.display.set_caption("計算器")         #命名  
10.	    ···                                   #此處放方便自己的初始變數  
11.	    c = (255,255,255)      
12.	    #開始的顏色  
13.	    screen.fill(c)                                 
14.	    #一開始顯示的東西,比如按鍵,有空還可以自己畫個圖示,等等      
15.	    screen.blit(X,(XXX,XXX))       
16.	    #這句話很重要,表示顯示,沒有這句話,不會顯示的         
17.	    pygame.display.flip()     
18.	    while True:  
19.	        #退出處理(當使用者按退出鍵處理)  
20.	        for event in pygame.event.get():  
21.	            if event.type == QUIT:  
22.	                pygame.quit()  
23.	                exit()  
24.	            ······    #想寫就寫,呵呵

先匯入pygame 和 sys兩個庫。接著是 “pygame.init“ 這起到了初始化的作用。根據自己的電腦,定義計算機的長和寬。

Pygame的顏色是根據紅黃藍三色控制的,每一級最高為255,最低為0。比如(225,225,225)就是白色,(0,0,0)是黑色。

pygame.blit 是 pygame 的顯示圖片,文字的方法。接下來的退出處理其實就是一個事件處理器,不斷地獲取使用者的操作,並對使用者的操作作出反應。

Pygame文字:
做什麼也不能沒有字,比若說,顯示就需要顯示數字。先看程式碼

1.	t = pygame.font.SysFont("arial",32)  
2.	  
3.	··· #想寫就寫,任性  
4.	  
5.	num = "XXX"   #想寫就寫,任性  
6.	word = t.render(num,True,(0,0,0),(225,225,225))  
7.	screen.blit(word,(XXX,XXX))   #XXX代表位置  

首先,需要確認字型,所有的電腦都會帶有字型,可以在 Font 資料夾裡找到,這裡就不再多說。

在第六行,這就是確認文字的顏色和底色。(0,0,0)代表著顏色,這裡是黑色,(225,225,225)代表底色,這裡是黑色。最後在(xxx,xxx)的位置顯示出來。

有小白會跳出來問,第六行那個True改成False會怎麼樣呢。放心,不會發生什麼事。都不會給你顯示了。

Pygame顯示圖片:

說了一堆,寫出程式後,最多顯示出一個白色的螢幕,按鍵顯示不出怎麼行呢?

Pygame有個函式 blit. 由於顯示其他的內容,剛講了文字,那也要用到blit函式。現在來講圖片的顯示

Pygame所有需要用的圖片都需要先匯入,這在前面已經詳細講過,這裡就不再多說。程式碼如下:

1.	ad = ("E://XXX/XXX/")   #位置  
2.	XXX = pygame.image.load(ad + "XXX.png")     #匯入圖片  
3.	···  
4.	  
5.	  
6.	def pscreen():  
7.	    screen.fill(225225225)  
8.	    screen.blit(XXX,(300,300))      #位置  
9.	    ···  

當然,不怕麻煩的可以這樣寫:

1.	ad = ("E://XXX/XXX/")   #位置  
2.	···  
3.	  
4.	  
5.	def pscreen():  
6.	    screen.fill(225225225)  
7.	    screen.blit(pygame.image.load(ad + "XXX.png",(300,300))      #位置  
8.	    ···  

完整程式碼:

講完了麼?一些小白覺得看這篇文章太累了,沒有完整的程式碼。那建議去
https://github.com/duoduo666/jisuanba_pygame_jisuanji/blob/master/%E4%BB%A3%E7%A0%81.py

看看完整的程式碼(可以直接拿來用)
結語:
現在,你應該可以自己做出一個計算器了吧,其實不僅僅是計算器,你還可以用pygame來做出任意一個程式,只要肯花費些時間,還可以用pygame寫出一個簡易的系統。

若是在使用我寫的計算器的時候,發現bug,請在github的issue塊留言,一定會在第一時間回覆的

在這裡插入圖片描述
如果覺得有收穫,可以加我的微信,請我喝咖啡哦

相關文章