Python基础教程书籍案例:P2P在线文件共享(使用XML-RPC进行文件共享)【四】

释放双眼,带上耳机,听听看~!

这一篇教程,我们完成P2P在线文件共享项目的最后一部分。

先看一下我们的最终实现目标。

Python基础教程书籍案例:P2P在线文件共享(使用XML-RPC进行文件共享)【四】

如上图所示,在下载器中我们需要添加一个文件列表,当下载完毕,文件列表刷新,显示已下载的文件。

并且,在本篇教程新增了一个双击列表中的文件名称打开文件的功能。

我们先来汇总一下要加入的所有功能、控件以及需要的模块。

一、类和方法

  • 需要为Node新增子类,在子类中添加获取文件列表的方法,在这个方法中要调用os模块中的listdir()方法。
  • 添加双击列表项打开文件的方法,在这个方法中需要os模块中的abspath()方法获取绝对路径,并通过system()方法打开文件。
  • 添加更新文件列表的方法。

二、控件

添加列表控件,并绑定双击事件的处理方法。

了解了要添加的内容,我们就可以编写代码了。

示例代码中的注释部分是新增内容。

示例代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
1from os import listdir  # 导入获取目录列表的方法
2from pclient import random_string
3from pserver import Node, UNHANDLED
4from xmlrpc.client import ServerProxy, Fault
5from threading import Thread
6from time import sleep
7from os.path import abspath  # 导入获取绝对路径的方法
8import wx
9import sys
10import os  # 导入os模块
11'''
12想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
13'''
14HEAD_START = 0.1
15SECRET_LENGTH = 10
16
17class ListableNode(Node):  # 定义Node子类
18    def file_list(self):  # 定义获取文件列表的方法
19        return listdir(self.dirname)  # 返回文件列表
20
21class Client(wx.App):
22    def __init__(self, url_file, dir_name, url):
23        self.dir_name = dir_name
24        self.secret = random_string(SECRET_LENGTH)
25        node = ListableNode(url, dir_name, self.secret)  # 实例化ListableNode节点对象
26        thread = Thread(target=node._start)
27        thread.setDaemon(1)
28        thread.start()
29        sleep(HEAD_START)
30        self.server = ServerProxy(url)
31        for line in open(url_file):
32            self.server.hello(line.strip())
33        super(Client, self).__init__()  # 这一句放在最后,否则Client对象的服务器代理尚未创建,无法正常运行。
34
35    def OnInit(self):
36        window = wx.Frame(None, title='文件下载器', size=(400, 200))  # 修改窗口高度
37        background = wx.Panel(window)
38        self.user_input = user_input = wx.TextCtrl(background)
39
40        submit = wx.Button(background, label='下载', size=(80, 25))
41        submit.Bind(wx.EVT_BUTTON, self.fetchHandler)
42
43        hbox = wx.BoxSizer()
44        hbox.Add(user_input, proportion=1, flag=wx.ALL | wx.EXPAND, border=10)
45        hbox.Add(submit, flag=wx.TOP | wx.BOTTOM | wx.RIGHT, border=10)
46
47        self.files = files = wx.ListBox(background)  # 添加列表控件
48        files.Bind(wx.EVT_LISTBOX_DCLICK, self.dclickItemHandler)  # 绑定列表项点击事件处理方法
49        self.update_list()  # 更新文件列表
50
51        vbox = wx.BoxSizer(wx.VERTICAL)
52        vbox.Add(hbox, proportion=0, flag=wx.EXPAND)
53        # 添加列表控件到垂直容器
54        vbox.Add(files, proportion=1, flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=10)
55
56        background.SetSizer(vbox)
57        window.Show()
58        return True
59
60    def update_list(self):  # 定义更新文件列表的方法
61        self.files.Set(self.server.file_list())  # 设置列表控件内容为文件列表
62
63    def dclickItemHandler(self, event):  # 定义列表项点击事件的处理方法
64        file_path = abspath('%s/%s' % (self.dir_name, self.files.GetStringSelection()))  # 获取文件绝对路径
65        os.system(file_path)  # 打开文件
66
67    def fetchHandler(self, event):
68        filename = self.user_input.GetValue()
69        try:
70            self.server.fetch(filename, self.secret)
71            self.update_list()  # 下载后更新文件列表
72        except Fault as f:
73            if f.faultCode != UNHANDLED:
74                raise
75            print('没有找到文件:', filename)
76
77def main():
78    url_file, dir_name, url = sys.argv[1:]
79    client = Client(url_file, dir_name, url)
80    client.MainLoop()
81
82if __name__ == '__main__':
83    main()
84

到这里P2P在线文件共享的练习项目就全部完成了。

大家可以在测试文件夹中添加多个测试文件,然后进行下载测试。

给TA打赏
共{{data.count}}人
人已打赏
安全经验

Google Adsense(Google网站联盟)广告申请指南

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索