20183215 2019-2020-2 《Python程式設計》實驗三報告
課程:《Python程式設計》
班級: 1832
姓名: 董振龍
學號: 20183215
實驗教師:王志強
實驗日期:2020年5月16日
必修/選修:公選課
1.實驗內容
1.創建服務端和客戶端,選擇一個通信埠,用Python語言編程實作通信演示程式;
2.要求包含檔案的基本操作,例如打開和讀寫操作,
3.要求發送方從檔案讀取內容,加密后并傳輸;接收方收到密文并解密,保存在檔案中,
4.程式代碼托管到碼云,
2. 實驗程序及結果
實驗開始之前,我設想了一下實驗結束后的效果,總覺得光禿禿的控制臺缺乏美感(盡管是pycharm),于是,我打算加入GUI圖形界面,既然追求美感,就貫徹到底咯,
首先,我打開了一個軟體:wxFormBuilder(這里我參考了一個大佬的博客),打開后的界面是這樣的:

我們先選擇Forms點擊Frame,然后再建立幾個boxsizer,加入一些必備控制元件textctrl、button,如圖,其中,設定bsizer5的proportion為9,使其看上去更加和諧

最后進行一些細節上的設定,例如按鈕名稱以及事件系結,最終效果如圖:

其中三個按鈕分別系結事件:



保存之后可以匯出對應的.py檔案,基本重復上述操作,可以得到客戶端的圖形界面和對應的.py檔案

打開pycharm,新建一個工程檔案夾,將上述兩個.py檔案復制到檔案夾中,然后新建兩個.py檔案,分別命名為severf.py和clientf.py,輸入以下內容繼承圖形界面
import wx
import severwindow #或clientwindow,下面同樣
class CliFrame(severwindow.Sever):
def __init__(self, parent):
severwindow.Sever.__init__(self, parent)
def main():
app = wx.App(False)
frame = CliFrame(None)
frame.Show(True)
app.MainLoop()
if __name__ == "__main__":
main()
pass
運行一下,結果如圖:


還有一點忘記說了,就是圖形界面的圖示和背景色,我在
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u" Client", pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
后面加入了,圖示是在這個網站上面搜的,就像我說的,既然要追求美觀,就貫徹到底咯
self.icon = wx.Icon('client.ico', wx.BITMAP_TYPE_ICO)
self.SetIcon(self.icon)
self.SetBackgroundColour('#00FFFF') #天藍色
接下來就是撰寫對應的事件函式
服務器的打開按鈕:
def open_file(self,event):
text=self.file_name.GetValue()
file=open(text,"rb+")
self.file_content_d.SetValue(file.read())
file.close()
服務器的加密按鈕:
def encrypt_con(self,event):
content_d=self.file_content_d.GetValue()
content_e=base64.b64encode(content_d.encode())
self.file_content_e.SetValue(content_e)
服務器的發送按鈕:
def send_file(self,event):
content=self.file_content_e.GetValue()
conn.send(content.encode())
客戶端的解密按鈕:
def decrypt_con(self,event):
content_d=base64.b64decode(content)
self.file_content_d.SetValue(content_d)
服務器的保存按鈕:
def save_con(self,event):
text=self.file_name.GetValue()
file=open(text,"wb+")
content_d=base64.b64decode(content)
file.write(content_d)
file.close()
最后匯入相關模塊就可以運行了,其中加密我用的是來自pycryptodome模塊的base64,運行結果如圖:

再然后就是老生常談的commit+push到git了,所有完整代碼在這里
3. 實驗程序中遇到的問題和解決程序
- 問題1:第一次繼承圖形界面并運行時報錯in _EvtHandler_Bind assert callable(handler) or handler is None
- 問題1解決方案:經檢查發現是按鈕的名稱與其系結事件用了相同的字串,經改正后就可以了
- 問題2:pycrypto的安裝出大問題
- 問題2解決方案:一開始我是知道pycrypto這個模塊,但是安裝卻一直失敗,百度之后,在這個博客(這個博客內容挺多,但是解決方法在最上面,??)中找到了解決方法:安裝pycryptodome模塊,完美解決,
- 問題3:運行時客戶端解密出錯
- 問題3解決方案:經檢查發現在content_d=base64.b64decode(content)的content后面加了.encode(),但是沒有必要,因為服務器send過來的已經是bytes形式,洗掉之后便可以正常運行了
感悟及思考
這次實驗讓我更好的了解了python的強大,wxFormBuilder的發現讓我感覺發現寶了,GUI圖形界面一直都是我學習各個程式設計語言時最鬧心的,這次實驗也讓我對于函式的運用更加熟悉,同時我感覺到還有很多值得我去開發去學習的,人生苦短,我學python,
參考資料
- 【教程】Eclipse+PyDev配合wxFormBuilder使用制作python圖形界面
- Python踩坑之路-Python-3.6 安裝pycrypto 2.6.1各種疑難雜癥及解決方案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145729.html
標籤:Python
