python 同步剪贴板的实现

因为需要在不同的电脑上同步代码,所有特别思考了一下这个主题。

本来使用 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 地址是否存在,聪明的你应该知道怎么办 =)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180927G0FWUB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券