因為需要在不同的電腦上同步代碼,所有特別思考了一下這個主題。
本來使用 VB 或者網頁的方法也不是不能做,不過考慮到很久都放著的 python 學習計劃,就決定用 python 來做了。
(私信小編007即可獲取Python視頻教程以及各類PDF!)
那麼,首先考慮一下實現網絡傳輸的方式,
嗯,據我所知的,兩種吧。
TCP 或者 UDP
考慮到我兩臺電腦都在一個局域網之內。
就直接選擇 UDP 這種“不是很可靠的方式了”
ch1.使用 udp 的通訊方法:
首先導入 socket 庫,根據 socket 庫的說明,使用 socket.AFINET 參數和 socket.SOCK_DGRAM 參數實現:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
之後。
綁定端口:
s.bind(('', 9999))
這個時候已經可以用 socket.Sendto() 發送信息 和
# 一直在監聽
while True:
# 接收數據 自動阻塞 等待客戶端請求:
data, addr = s.recvfrom(2048)
print 'Received from %s:%s.' % addr
print 'get: %s' %data
使用如上的代碼接收信息。
ch2.用戶界面。
命令行對我來說自然是相當不夠的,為了給它加上窗口,按鈕等,我不得不使用一套 UI 庫,這裡是 比較常用的 Tkinter ,稍微摸清楚彼此的脾氣之後,做出瞭如下的界面。
為了修改 Text 中的值,還製作了一個 ModeText(text, cText) 事件:
def modText(t, atext):
t.delete(1.0, tk.END)
t.insert(1.0, atext)
其實也很簡單,就是清空 Text 內容後,然後插入自己的內容——直接修改的命令?我似乎是沒找到,然後獲取文本的方法,是 Text.get(開始,結束)
如此以後,基本的用戶界面算是完成了,不過很快就遇到了問題,在執行用戶界面到 mainloop() 的時候,接收數據的部分如何執行呢?
ch3.線程的控制
為了解決用戶界面和接收信息循環同時並存的問題,就需要用到線程(這裡是 Threading 庫),
線程的適用方法,大體上是改寫了 線程的 run 事件,將 接收信息的模塊放到 線程中去,
改寫 run 事件如下:
def run(self):
Receive(self.s, self.vEdit)
這裡的 self.s 就是 socket, 而 self.vEdit 就是負責顯示文本的文本框(Text),
通過將 self.vEdit 傳入,進行文本的發送和接收顯示。
接下來,給剪貼板增加一些其他的功能。比如發現接受到的是網址就打開瀏覽器,接收到特殊格式的命令,直接操作電腦等等。
ch4.一些擴展的周邊
ch4.1. 操作剪貼板
使用 pyperclip 的庫,簡單地就可以操作剪貼板,
pyperclip.paste()
pyperclip.copy('text to run')
後面我發現其實使用 tkinter 自帶的功能也可以實現操作剪貼板,
在 python2 中來說 ,還沒有 字符編碼的問題。
ch4.2. 正則判斷
正則判斷基本就是用 re 實現的,這沒什麼好說的,判斷網址:
# 對網址的處理
if re.match(r'^https?:/{2}\w.+$', data):
print "It's a url"
ch4.3. 打開瀏覽器:
這個也很簡單,使用 webbrowser 庫
webbrowser.open(url)
ch5.需要解決的問題(已經解決)
前面所說的線程有一個問題,就是當窗口退出的時候,線程並不會結束,
經過一番搜索,嗯,掙扎,總算找到了問題的突破點,就是關閉窗口的事件,
Tkinter 關閉窗口的事件是這個 :
tk.protocol("WM_DELETE_WINDOW", on_closing)
然後定義 on_closing 事件,在其中加入強制關閉的命令:
os._exit(0)
(哈哈,當然你首先要 import os)
為什麼不用 sys.exit(0) ? 這個你可以自己嘗試一下。
然後有個問題,就是判斷 目標 ip 地址是否存在,聰明的你應該知道怎麼辦 =)