20183215 實驗三《Python程序設計》實驗報告


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。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM