• BT源代码学习心得(九):客户端源代码分析(图形界面浅析) 转自CSDN:gushenghua的专栏


    发信人: wolfenstein (NeverSayNever), 个人文集
    标  题: BT源代码学习心得(九):客户端源代码分析(图形界面浅析)
    发信站: 水木社区 (Fri Aug 12 17:03:19 2005), 文集
    (本文包含HTML标记,终端模式下可能无法正确浏览)
        客户端将从btdownloadgui.py开始进行分析,这样可以顺便把Python中的GUI编程也看
    一下。Python中的GUI编程也有很多内容,所以不可能深入得分析,仅仅以BT的源代码为例
    看一下。
        btdownloadgui.py中使用gtk作为其图形界面的开发库。这个库中提供了很丰富的类,
    可以来创建图形界面中所需要的各种widget,而在主要的窗口类DownloadInfoFrame的初始
    化过程中,程序的主要任务就是创建窗口中要用到的各种各样的widget,并且把它们加入窗
    体。然后用connect函数把某个widget上可能会发生的事件与某个处理函数连接起来,这样
    ,一个GUI界面就建立起来了。具体的过程可以参考gtk的每个类的说明文档,并不困难。
        这里再简单介绍一下btdownloadgui.py中的其它的类。它们通常都是GUI界面中的各种
    子窗口,需要在某个按钮或者菜单被选中后弹出。我们也可以看到作者在GUI界面方面的设
    计的一些巧妙之处。
        Validator:在一个基本的Entry上继承的类,但是可以对用户输入的值进行判断,只有
    出现在有效字符列表中的输入有效。另外在这个类的基础上还继承了IPValidator,
    PortValidator,PercentValidator,MinutesValidator对各种输入数据进行校验。
        RateSliderBox:这是一个表示速率的滑动块,可以根据鼠标的调整显示出对应的速度
    以及相应的网络连接类型。内部完成了滑块位置和对应速率的转换。
        StopStartButton:停止/开始按钮,可以通过点击这个按钮来临时停止或者恢复所有的
    种子的下载。
       VersionWindow(显示版本信息),AboutWindow(显示关于信息),LogWindow(显示日志)
    ,SettingsWindow(进行一些参数设置),FileListWindow(文件列表窗口),
    PeerListWindow(对等客户列表窗口),TorrentInfoWindow(种子文件信息窗口)都是一个子
    窗口,它们在相应的功能被调用时会弹出来,其中LogWindow使用到了LogBuffer中的内容,
    即在任何需要记录日志的地方调用LogBuffer的log_text函数,然后LogWindow可以把它们都
    显示出来。
        TorrentBox是一个种子文件下载任务在图形界面上的表示的基类。里面定义了名称标识
    ,状态图标,进度条等等GUI元素,所有的下载任务都以这个类为基类。KnownTorrentBox则
    是已经不在下载任务列表的图形界面表示,可以把它拖到下载队列中,这样就可以继续下载
    这些任务,这有两种情况,把已经完成的任务拖到下载队列中就表示要继续做种,而把已经
    失败的任务拖到下载队列中就表示要恢复下载。DroppableTorrentBox是一个增加了托拽对
    象处理的类。以DroppableTorrentBox为基类的类有QueuedTorrentBox,PausedTorrentBox
    ,RunningTorrentBox分别对应了还在队列中的下载任务,暂停的任务和正在运行的任务。
    KnownTorrentBox的区域中的项目可以托拽到下载队列中,另外QueuedTorrentBox和
    PausedTorrentBox,RunningTorrentBox中的项目可以自由托拽,满足用户对下载任务的队
    列管理要求。这里还要提一下,那就是RunningTorrentBox和PausedTorrentBox不能同时出
    现,它由开始提到的StopStartButton管理,即暂停/运行所有的任务,而
    QueuedTorrentBox是那种由于同时下载的任务的数量的限制而暂时得不到下载的任务,即使
    StopStartButton的状态是运行所有任务,它也不会被运行,只有当某个下载任务结束或者
    中止后,系统从队列中选取一个进入运行队列。
        以上是每一个具体的运行项目对应的widget,下面来看它们的容器,HSeparatedBox是
    一个容器的基类,定义在BitTorrent/GUI.py中,这个模块中还定义了其它一些为GUI显示方
    便的函数和对象。HSeparatedBox中可以添加若干子窗口,并且可以对它们进行重新排列,
    另外它可以用分割线分割添加进来的子窗口。DroppableBox是HSeparatedBox的子类,它增
    加的功能是处理托拽对象离开,KnownBox则又是DroppableBox的子类,它将被填充进若干个
    KnownTorrentBox,对应的还有RunningBox和QueuedBox,填充入相应的下载任务的widget(
    注意到PausedTorrentBox和RunningTorrentBox不能同时出现,它们都被放在容器
    RunningBox),而RunningAndQueueBox是一个同时塞进了RunningTorrentBox和QueuedBox的
    容器。
        系统中每个TorrentBox保存某个具体种子的信息仅仅是为了显示,当需要的时候,这些
    widget都是随时被删除,或者创建,或者进行重新排列,这些种子的随着运行的时间一些统
    计信息发生改变,也会通过这些widget显示出来。
        BitTorrent/TorrentQueue.py模块完成了从GUI界面到实际的种子下载任务的模块中的
    衔接。它实现了Feedback的接口,这样当某个种子的下载任务发生变化(如完成,出错等)后
    ,可以及时得通知它,然后显示在GUI界面上。通过分析其它的BT的下载程序(即非图形界面
    的下载程序,如btdownloadheadless.py等),也可以看到有一个继承了Feedback接口的类,
    但是它的实现方式通常是以文字的形式表现出种子的变化。另外,TorrentQueue模块还可以
    恢复上次的下载情况(读取一些状态文件),通过所有的下载程序的分析(图形界面的或者文
    本的)我们可以认为,实际执行下载任务的对象是BitTorrent/download.py中的
    Multitorrent对象为。而TorrentQueue的代码仍然算在GUI部分中,通过分析它的代码,我
    们已经知道它已经读取了相应的种子文件中的信息,并且进行了相关的处理。
        由于我们主要是要分析BT的客户端的实际功能代码,因此GUI部分只能比较简略得说一
    下,其实这部分可以对着gtk的参考手册看相关的图形界面程序的源代码
    (btdownloadgui.py,btmaketorrentgui.py),还是比较好分析的。下一次开始就可以分析
    BitTorrent/download.py中的Multitorrent,直奔主题了。
  • 相关阅读:
    zoj1589Professor John
    zoj1082Stockbroker Grapevine
    zoj1311Network
    zoj1060Sorting It All Out
    zoj1119SPF
    zju1085Alien Security
    zoj 2474Benny's Compiler
    zoj1068P,MTHBGWB
    what's next?
    ski for the first time~
  • 原文地址:https://www.cnblogs.com/kokoliu/p/616919.html
Copyright © 2020-2023  润新知