20183215 2019 2020 2 《Python程式設計》實驗三報告 課程:《Python程式設計》 班級: 1832 姓名: 董振龍 學號: 20183215 實驗教師:王志強 實驗日期:2020年5月16日 必修/選修:公選課 1.實驗內容 1.創建服務端和客戶端,選擇一個通信埠,用P ...
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這個模塊,但是安裝卻一直失敗,百度之後,在這個博客(這個博客內容挺多,但是解決方法在最上面,