因为需要在不同的电脑上同步代码,所有特别思考了一下这个主题。
本来使用 VB 或者网页的方法也不是不能做,不过考虑到很久都放着的 python 学习计划,就决定用 python 来做了。
那么,首先考虑一下实现网络传输的方式,
嗯,据我所知的,两种吧。
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?:/\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 地址是否存在,聪明的你应该知道怎么办 =)
领取专属 10元无门槛券
私享最新 技术干货